From d1e602647c11ec5a82bb8c29a87cafc46cd5fbcc Mon Sep 17 00:00:00 2001 From: fairy <3054158379@qq.com> Date: Tue, 15 Sep 2026 16:24:49 +0800 Subject: [PATCH 1/7] fix(diagnostics): suppress unclean-exit after upgrade or overwrite install An in-app update can be force-killed before will-quit, and a leftover session marker from another version is a reinstall, not a crash. Co-authored-by: Cursor --- docs/desktop-rollout-diagnostics.md | 2 +- src/main/desktop-service/service.ts | 2 +- src/main/index.ts | 3 +++ test/desktop-service.test.ts | 16 +++++++++++++--- test/update.test.ts | 6 ++++++ 5 files changed, 24 insertions(+), 5 deletions(-) diff --git a/docs/desktop-rollout-diagnostics.md b/docs/desktop-rollout-diagnostics.md index 83edf9f8a..ad6ecdb64 100644 --- a/docs/desktop-rollout-diagnostics.md +++ b/docs/desktop-rollout-diagnostics.md @@ -16,6 +16,6 @@ The installation ID is a random UUID at `/desktop-service/installation Harness launch attempts report startup-failure before readiness or harness-crash after readiness. Reporting awaits the actual log-stream write callback. Renderer/GPU loss is persisted synchronously before recovery can exit the app. Main JavaScript fatal exceptions use uncaughtExceptionMonitor and preserve the default crash behavior. A queued fatal event and the next unclean-start marker reuse the same event ID for deduplication. -Normal will-quit and intentional GPU relaunch clear the session marker. Native crashes, power loss or forced termination are reported as **unclean-exit on next launch**, not as a proven crash; they cannot reliably send HTTP from a dead process. If the app never reaches initialization again, there is no guarantee of delivery. Initialization/reporting failure does not prevent application startup. +Normal will-quit, intentional GPU relaunch, and in-app update install clear the session marker. Native crashes, power loss or forced termination are reported as **unclean-exit on next launch** only when the leftover marker version matches the current app version and the previous session log does not look healthy; they are not a proven crash and cannot reliably send HTTP from a dead process. A leftover marker from a different version is treated as an upgrade or overwrite install and is not reported. If the app never reaches initialization again, there is no guarantee of delivery. Initialization/reporting failure does not prevent application startup. This does not yet track installer/download errors or correlate upgrade attempts with installation success. It also does not change signing or update-package verification settings. Real packaged macOS/Windows crash and upgrade acceptance remains separate from unit/build/CI validation. diff --git a/src/main/desktop-service/service.ts b/src/main/desktop-service/service.ts index e3721446a..3713f5716 100644 --- a/src/main/desktop-service/service.ts +++ b/src/main/desktop-service/service.ts @@ -97,7 +97,7 @@ export class DesktopService { if (existsSync(this.marker)) { try { const old = JSON.parse(readFileSync(this.marker, 'utf8')) as { eventId: string; version: string } - if (uuid.test(old.eventId) && isVersion(old.version)) { + if (uuid.test(old.eventId) && isVersion(old.version) && old.version === this.options.version) { const log = tailLog(this.options.logPath) if (!isHealthySessionLog(log.lines)) { this.capture('unclean-exit', 'Previous session ended without a clean shutdown (crash, power loss or forced termination).', old.eventId, old.version) diff --git a/src/main/index.ts b/src/main/index.ts index 76a1d883e..59abc8a14 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -3128,6 +3128,9 @@ async function bootstrap(): Promise { const dshHome = join(app.getPath('userData'), 'harness') await quarantineInstalledLaunchAgentsForUpdate(dshHome) quitting = true + // NSIS may force-kill before will-quit; clear the marker so the next + // launch does not treat this intentional update as an unclean-exit. + desktopDiagnostics?.markCleanExit() stopUpdateManager() } }) diff --git a/test/desktop-service.test.ts b/test/desktop-service.test.ts index 987a5125c..d76eaa5c1 100644 --- a/test/desktop-service.test.ts +++ b/test/desktop-service.test.ts @@ -112,12 +112,16 @@ describe('desktop service', () => { request.mockImplementation(async (_url: string, init?: RequestInit) => new Response(JSON.stringify({ accepted: true, eventId: JSON.parse(String(init?.body)).eventId }))) await Promise.all([service.flush(), service.flush()]); expect(request).toHaveBeenCalledTimes(50); expect(service.pending()).toHaveLength(0) }) - it('attributes an unclean exit to the previous version and does not report clean shutdowns', () => { + it('reports an unclean exit only when the leftover marker belongs to this version', () => { const { service, options, dir } = fixture() service.beginSession() const next = new DesktopService({ ...options, version: '0.9.0' }); next.beginSession() - expect(queued(next, dir)[0]).toMatchObject({ version: '0.8.0', kind: 'unclean-exit' }) - next.markCleanExit(); new DesktopService(options).beginSession(); expect(next.pending()).toHaveLength(1) + expect(queued(next, dir)).toEqual([]) + next.markCleanExit(); new DesktopService(options).beginSession(); expect(next.pending()).toHaveLength(0) + const same = new DesktopService(options) + same.beginSession() + expect(queued(same, dir)[0]).toMatchObject({ version: '0.8.0', kind: 'unclean-exit' }) + same.markCleanExit(); new DesktopService(options).beginSession(); expect(same.pending()).toHaveLength(1) }) it('does not replace a queued fatal report with a generic unclean-exit report', () => { const { service, options, dir } = fixture() @@ -125,6 +129,12 @@ describe('desktop service', () => { new DesktopService(options).beginSession() expect(queued(service, dir).map(r => r.kind)).toEqual(['main-crash']) }) + it('keeps a queued fatal report when a later version starts after an upgrade', () => { + const { service, options, dir } = fixture() + service.beginSession(); service.captureFatal(new Error('fatal')) + new DesktopService({ ...options, version: '0.9.0' }).beginSession() + expect(queued(service, dir).map(r => r.kind)).toEqual(['main-crash']) + }) it('queries with no channel/arch and rejects invalid or downgraded policy responses', async () => { const { service, request } = fixture() request.mockResolvedValue(new Response(JSON.stringify({ updateAvailable: false }))) diff --git a/test/update.test.ts b/test/update.test.ts index a056ba577..8752cd2cd 100644 --- a/test/update.test.ts +++ b/test/update.test.ts @@ -48,6 +48,12 @@ describe('desktop update policy', () => { expect(prepare.indexOf('await quarantineInstalledLaunchAgentsForUpdate(dshHome)')).toBeLessThan( prepare.indexOf('quitting = true') ) + expect(prepare.indexOf('quitting = true')).toBeLessThan( + prepare.indexOf('desktopDiagnostics?.markCleanExit()') + ) + expect(prepare.indexOf('desktopDiagnostics?.markCleanExit()')).toBeLessThan( + prepare.indexOf('stopUpdateManager()') + ) }) }) From 1f6330705d88566d44c9bf32a1d7315765c92f4b Mon Sep 17 00:00:00 2001 From: yaojin3616 Date: Tue, 15 Sep 2026 02:12:57 -0700 Subject: [PATCH 2/7] fix(diagnostics): suppress startup failure report when frontend identifies incompatible plugins --- src/main/desktop-service/diagnostics.ts | 21 ++++++++++--- src/main/index.ts | 1 + test/desktop-service.test.ts | 40 +++++++++++++++++++++++++ test/plugin-error-view.test.ts | 8 +++++ 4 files changed, 66 insertions(+), 4 deletions(-) diff --git a/src/main/desktop-service/diagnostics.ts b/src/main/desktop-service/diagnostics.ts index d4f110010..b57ae1723 100644 --- a/src/main/desktop-service/diagnostics.ts +++ b/src/main/desktop-service/diagnostics.ts @@ -20,9 +20,10 @@ export function attachDiagnostics(app: EventEmitter, service: DesktopService, op } let canSend = false let pendingPluginFailureEventId: string | undefined + let suppressPluginFailure = false const capture = (kind: FailureKind, message: string, eventId?: string) => { safe(() => service.capture(kind, message, eventId)) - if (canSend) flush() + if (canSend && eventId !== pendingPluginFailureEventId) flush() } safe(() => service.beginSession()) const fatal = (error: Error) => safe(() => service.captureFatal(error)) @@ -60,10 +61,18 @@ export function attachDiagnostics(app: EventEmitter, service: DesktopService, op flush() }, runtimeChanged(snapshot: RuntimeSnapshot, flushLog: () => Promise, attempt = 0) { - if (attempt !== previousAttempt) wasReady = false - if (snapshot.phase === 'starting') wasReady = false + if (attempt !== previousAttempt) { + wasReady = false + suppressPluginFailure = false + pendingPluginFailureEventId = undefined + } + if (snapshot.phase === 'starting') { + wasReady = false + suppressPluginFailure = false + } if (snapshot.phase === 'ready') { wasReady = true + suppressPluginFailure = false if (pendingPluginFailureEventId) { service.discard(pendingPluginFailureEventId) pendingPluginFailureEventId = undefined @@ -73,8 +82,11 @@ export function attachDiagnostics(app: EventEmitter, service: DesktopService, op const kind = wasReady ? 'harness-crash' : 'startup-failure' // Wait for the actual Harness stream callback, not a guessed timer. void flushLog().catch(error => options.onError?.(error)).then(() => { - const eventId = randomId() const isPluginFailure = Boolean(snapshot.pluginFailures && snapshot.pluginFailures.length > 0) + if (!wasReady && isPluginFailure && suppressPluginFailure) { + return + } + const eventId = randomId() if (!wasReady && isPluginFailure) { pendingPluginFailureEventId = eventId } @@ -85,6 +97,7 @@ export function attachDiagnostics(app: EventEmitter, service: DesktopService, op previousAttempt = attempt }, discardPendingPluginFailure() { + suppressPluginFailure = true if (pendingPluginFailureEventId) { service.discard(pendingPluginFailureEventId) pendingPluginFailureEventId = undefined diff --git a/src/main/index.ts b/src/main/index.ts index 59abc8a14..d000436ff 100644 --- a/src/main/index.ts +++ b/src/main/index.ts @@ -2965,6 +2965,7 @@ async function bootstrap(): Promise { ipcMain.removeHandler('harness:open-recovery') ipcMain.handle('harness:open-recovery', async (event, frontendErrorMessage?: unknown) => { assertTrustedMainWindowEvent(event) + desktopDiagnostics?.discardPendingPluginFailure() const message = typeof frontendErrorMessage === 'string' ? frontendErrorMessage : undefined if (message) appendRendererPluginFailureLog(message) const logs = [...rendererPluginFailureLogs] diff --git a/test/desktop-service.test.ts b/test/desktop-service.test.ts index d76eaa5c1..327dc2381 100644 --- a/test/desktop-service.test.ts +++ b/test/desktop-service.test.ts @@ -215,6 +215,46 @@ describe('diagnostic event integration', () => { diagnostics.runtimeChanged({ phase: 'ready', message: 'ready', logs: [] }, async () => {}) expect(service.pending()).toHaveLength(0) }) + it('discards pending plugin failure when frontend opens recovery, even with active sending', async () => { + const { service, request } = fixture() + request.mockResolvedValue(new Response(JSON.stringify({ accepted: true }))) + const app = new EventEmitter() + const diagnostics = attachDiagnostics(app, service); disposers.push(() => diagnostics.dispose()) + diagnostics.startSending() + const failedSnapshot = { + phase: 'failed' as const, + message: 'plugin error', + logs: [], + pluginFailures: [{ stage: 'import' as const, packageName: 'test-plugin', message: 'failed', chain: [] }] + } + diagnostics.runtimeChanged(failedSnapshot, async () => {}) + await vi.waitFor(() => expect(service.pending()).toHaveLength(1)) + expect(request).not.toHaveBeenCalled() + // Frontend identifies the incompatible plugin and invokes discard + diagnostics.discardPendingPluginFailure() + expect(service.pending()).toHaveLength(0) + expect(request).not.toHaveBeenCalled() + }) + it('suppresses plugin failure report when discardPendingPluginFailure is called before log flush completes', async () => { + const { service, request } = fixture() + const app = new EventEmitter() + const diagnostics = attachDiagnostics(app, service); disposers.push(() => diagnostics.dispose()) + diagnostics.startSending() + let finishLog!: () => void + const logPromise = new Promise(resolve => { finishLog = resolve }) + const failedSnapshot = { + phase: 'failed' as const, + message: 'plugin error', + logs: [], + pluginFailures: [{ stage: 'import' as const, packageName: 'test-plugin', message: 'failed', chain: [] }] + } + diagnostics.runtimeChanged(failedSnapshot, () => logPromise) + diagnostics.discardPendingPluginFailure() + finishLog() + await new Promise(resolve => setTimeout(resolve, 50)) + expect(service.pending()).toHaveLength(0) + expect(request).not.toHaveBeenCalled() + }) }) it('waits for the actual Harness file stream before capturing its final error', async () => { diff --git a/test/plugin-error-view.test.ts b/test/plugin-error-view.test.ts index 0f791d86f..39efbe861 100644 --- a/test/plugin-error-view.test.ts +++ b/test/plugin-error-view.test.ts @@ -66,6 +66,14 @@ describe('preload wiring for plugin error handling', () => { expect(preload).toContain('findBootFailureText(document)') expect(preload).not.toContain('document.body?.innerText') }) + + it('discards pending diagnostics plugin failure when recovery is opened', async () => { + const main = await readFile('src/main/index.ts', 'utf8') + const recoveryHandler = main.slice(main.indexOf("ipcMain.handle('harness:open-recovery'")) + const handlerBody = recoveryHandler.slice(0, recoveryHandler.indexOf('})')) + + expect(handlerBody).toContain('desktopDiagnostics?.discardPendingPluginFailure()') + }) }) describe('boot failure page detection', () => { From 7e7917064c5e29201baf726dc0daf5c395f9e6ad Mon Sep 17 00:00:00 2001 From: yaojin3616 Date: Tue, 15 Sep 2026 03:12:40 -0700 Subject: [PATCH 3/7] fix(build): preserve runtime skill markdown files in build output and update ppt artifacts --- package-lock.json | 3 +- package.json | 12 ++- .../dsh-ppt-0.1.1-rc.2-desktop-20260906.tgz | Bin 10522325 -> 10522726 bytes packages/ppt-runtime/artifacts.json | 4 +- packages/ppt-runtime/core/lib/index.js | 71 ++++++++++++++++-- 5 files changed, 78 insertions(+), 12 deletions(-) diff --git a/package-lock.json b/package-lock.json index c3292cdfb..9cf2bda8b 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10104,7 +10104,8 @@ "node_modules/dsh-ppt": { "version": "0.1.1-rc.2", "resolved": "file:packages/ppt-bundles/dsh-ppt-0.1.1-rc.2-desktop-20260906.tgz", - "integrity": "sha512-SyZs2qWMNRY+XTHmz02cjgQzFKWG73escGM4frfgKhuJlb0/ErjiBoi6YcQOIlw4R4/M1qTVkd8vdNxWvDilQw==", + "integrity": "sha512-xFhBoyKRhgRudBtEVyxSbZvFVVkUGvOcEWVm1cjAjDR/vPaXgtA4h32uH3tI9oLDl8VefPTpdEui089B1XIVPQ==", + "dev": true, "license": "MIT", "dependencies": { "@aiden0z/pptx-renderer": "1.2.4", diff --git a/package.json b/package.json index 7d3a9fe81..dc2367a06 100644 --- a/package.json +++ b/package.json @@ -323,8 +323,16 @@ "!**/*.map", "!**/*.d.ts", "!**/*.tsbuildinfo", - "!**/*.md", - "!**/*.markdown", + "!**/README*.md", + "!**/readme*.md", + "!**/CHANGELOG*.md", + "!**/changelog*.md", + "!**/CONTRIBUTING*.md", + "!**/contributing*.md", + "!**/SECURITY*.md", + "!**/security*.md", + "!**/LICENSE*.md", + "!**/license*.md", "!node_modules/typescript/**", "!**/node_modules/**/test/**", "!**/node_modules/**/tests/**", diff --git a/packages/ppt-bundles/dsh-ppt-0.1.1-rc.2-desktop-20260906.tgz b/packages/ppt-bundles/dsh-ppt-0.1.1-rc.2-desktop-20260906.tgz index b599a4187d76ebedd8e46af2fedb8af2b0547bdb..fb649be8a4280a644bb3dc38830aaffb245cf06b 100644 GIT binary patch delta 459841 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�-N8*hLQL_Bg1k()Np8`T> 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%0D$$fyfP}Wp$>s|li=mTey0^}~YNAv5#9VN}) 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�>zS*w{&- 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

4aFmtJWIY1YXbmuJpZcKs=f|yjc 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 z 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

)J%+}-g1D1iMcRe5I2=N!ZZDcKjT-QA z6?|vF6x|Xy?&m8|QAXInNJP=a48Zu3U(N8`_QIMlJr8i1pFmnKT~!T zJ1<+wUm{GUDp<45mtpo)j_AP4W<(7=AzdO7fc8jE31$JQR*ix=m`1@PeBjAe;AjWTSPq2O z!n@Bc>6CpK*xd2vkagQ9jyqKKqCr-iksr*)zgo_y*%@K+rh#c*)XaBiA-$bz)OS=QlRUwK5rRBUK109~ht=0#1Nit5 z=YqRLeE-xiyYO#vMdibTrJ_}7x*X2TMX7;I?#BVjRp^8ibYj7-lKb08jsoX@wyqx= zZw9)m5o%9%jp|1hfTrJ(D4o%C4S3dcpUmZC+cIT2(v>35prGfAUH4-TynG5Psxc{P z8}8tFHEkYN=U;Zu?-Wb+wwnEZOEuf%2nxj;)cxXEYga4bu9hyQmmz5v+l7)MnugUj9&xo6%@^L>P6^xn-_+uaiNv$pCpYe5>@GA zP_Rsq{WQ}aaKhcowAQRm`_WD7m>9R8D&$41D{C(?{ZcKUzSX)Y`1o;APC&hP48PG# zj0~@hf_$SW5%BzV7_}~LgzN1UHo(BBxn@mi6MxSTe#?SR4As+N_TGO+%P5uVks+MZ z7WKGN)SW6#>7LrJc-W9O(q+0TG9UyHQhF-p-vRzN2atvyx7S*fa?zpRew{nHyp zt{CE~FMPFzh~Cq;kvEO&dnd~){rFYp_x^WpF`mXf|19laZcmyXtg2gJq9_ZIV5)sLz)lUo*5YPu|EphQDIb!ZgeN?tro9v6$(Bgp9 z4-}?NiU+|iGE$4)^+pEvnN-yF(B1GLAWg0C@b2_-B$F2-;%yWdLkS-e9}&~41i&D{ zIr$gt(Y}R(AwgvAopN$<$}omPqs61Z>z11Wy_bNwzP-6a&84so2#$o02yej>6s)9KkQJ=%VK!(m({K$8i#J0y5#uBV|ZZ!U+li3x8v&BKerTrK7RfBZ~yX93%#h zVJ`ZV00qDMoNd@WZSQihL* zGTPEIb8cHxz0i8fk91|Apf}czFCzJx0CSv@CEFr6_6VFqG5-_14V(A&2F!a0F77C% zJ~0Bz*uL8Tf&O!COVX3E@YC74EbI<(Id<4CUhfp7uO>iho)RJiQ2s110z;*sMb!V z(rQ8D)YDM#_dV^OXHTw4yi|d2eAn5bbL7?XGsU|t1gmlS_Bfc14ouP1CK$YU1F+_# zEzHWPTKa6RwkvCm!na<1C-U#J3bh%=Nl3fAGG< zC%U3Elezs0347SPr0TdF-#z2*z%>g*<0Tr+jJ6I|{n|^&sf0iCldv2ZvWyGo7u{5e zXkv>0y$I9b`Zou48Mm4yyxx>2_^rfIueST$L^u7*HM$^C_^hqGWgY9+h$ASqfxTaE zGJEJ3goCo!C#PCfhaz$?W#T!Ps0dOKR(B+_8oFFcuWzqDXR+h|N>Q~L$Z~OZo@?jY zA20ChsXst6f^^=9v;!Y?4BvISmg24Jy%X*q`k*#a5!eYS=9 zrysY&*)1~-LlJ4Qa>Vlu9`Jsz!tUjq?(5y)_PTasu-j7BOUGaBCQlWsB}`IW7Us8- zISRUQwquCWJZ_!Ne^bBqoEBBDJ(?vkvc&T#@{a5L9;?j&Ib?CuGqKFP9|KK&E9+_+ZMK&c7Yo z?7@%!Q~2}G&yQKIaGhLM>wux2zlHsp`&NARl~RqRznAh}Rv5QAw$uA}F2kQ|=!f~w zb)+T;zH!$AEOtysfXQOd+arMMrH8K<^OdC>a-ksqS4jUn8liJS_Q&$~+$M0(6%sU! zt88N7!{+nUyFGDPd&`kGJ)5&rtXxz1%Ma2n)(1b!XT&5vqU-F|vUn(Qy)E7~_Nr+} zx}{~v-e#4tD2(K#F5Zjj)N`2MKnt03VFkn(fLz@NfqLxsWNAl6Npe<&UnIKN$1|o) zEZI>}$8-_Z`$%@>-vrb%fIgr7_CS-zbdt>sIDK~{qI&pY)tQC|iRg zY6U9_=as+l++(bxnLKUG$YShFbxeb<^V1OTPyUr_Kv8^v6YJ~wLSbl6o=etYT?+7; zMEL#;_WM$F3jdMx&#??NlQ4E%Ka?zZt{MvtBsDPAO%K5=IIQ3UVe%m-CkjJ#CGD(c zalhPzrOC3J3&$GQl%h;2m(cbrv*9lm%5ggM4}?zZ2qei2#_|;btv4bPd;;Z+hKJ6E z*(%}V`aR4PlH%Op_T-Bh+(rv`5l*34jri8AKW-ecyk2q1=2g-; z0*;)j*U1THrnQpC#TH=}PLh?Ks_%)SwX2Ko3^?`7#y3vDm#Rj?g1*7+Z@3k zDxL;6ddtoC(>Rx?HwfSUObs~uo>cPXt3`JkcgJ`t=Lyi=$m6hlcbdLtpQZ)4IXzUW zuYI-nNom>h<#_plSCj1}ru0y$r=Er_3PohBm^hyVTCrO*OoeVeOLE{}MA zX|HdVKpBbsizM+r@bgitY)4&%#;`7GU!76&O|KU zi~dEKd%aB%qZAf%2)VDT+Br+VQT%&l+TeGT^+$2TT+5VHvvl+=M1z;5*9X3^)yrR@ z_F{x+Q`RdS{*PFVATfn*^l#BONpNEqy6@LfoX9#9^(4TgJQLmH*f5>B z7>=a$245VeXIkZRgd$=mHCvM?Ox`A}ii5FkHs0VXZt7gQU+?}xv+YBx)_d|~W4^FN zb1gi+NUP%3D%z74Pxm!j7f6)Yt`0_&A{8X1_r*%w3rj|D0yd`ryTD0D(xea_F3|2Q zlfo3~2bb5oXEpB^KYail4hh*lqzP7vwrOxrr8h_^Qv9Z7_+jju9X{rwrAPg657fRa zhFJjADtl%~nClV1>XupzoC#1da>eLEm=XOWuVVwtXy-DPo<>D9US zjgK=4WMwJNfLqczVTy#DC4lDek-3Vw>6Q09`5T;lk{4beqZSZJ9KQ|PFn{%ot6ZD* zl@j1A4V+3UhH21oCvXZsW9lXH?4#1OAc6Ta335ftWX z!&LeI5KJP8cEdBsZZU$K@v8w-URK!ftcQ2A=xk&U(E}#4gh6T%<1OFkUVc_Gr23-h+ zDp}YGm%ZK2&BuLu+1&{f1cDN%%>7VG0o8%5AhDEP||40On=;hnWYmd0q`@IBFHqe?_oYrMEi=$=x~w7Dcu<;9v3l-WO1c zyQ(o``*A7z2Xr4SmIB4U@)?cR2_q}nJFWl~-yi$N;#Ty%4 z?)>DGzY_g1=t2_d)Q3e38tc=hB->?a@+;(|*}R48#*yh{w0F!iT!j|2jZtf+)(?AMpCNcBil#_4U~Zj4rj* z^J*#724T4DCnxYAG-P@{SlE5^uXdmN*Sm6geeM005@tRlg@38Wz31!yiD~>7Y1A>A z(9LeCmZ|**Y?M3euE);nVBs#{L-@V3k)t;H_6P!j9}V_q7N*ql0~#~R_%|ZVi>niU zJdaT@V&n^}s-IuSbK?S5@^m4cbL3Sx^Nv01p4RVyQ{OHxpW~4>2+s;ZAnX+ZRUO0g zoSyshH%I6G4ScLFMU1td29O3yh7uSNq75{E`C>70**KfECy{F_5*WK`#>498(%IMA@0y!cnx7%K$4_?K3Bo-=2RCRg0npVf5MVj0N{Dp~z-JqhG-y*_k)DBXe>XK{{HNQXh8WfX=I3n={x`)+7W+G*&5xbM-Kjh8| z2bCy+V4$OUI(9f4q6iDbFvgz)VSUH*ky*hf-~Zf&7NfH!`J1{%6^U_hk3j?DaI0sG z-0h@U+$JSqNFEe7h2uDq9O_yiXD)T_tjq@Y&oGuS+fPBK2t zW8-nmoBdi*!~MZ%Q0L)NAmEjBB;?xAa<((7UjAwlF3Tp!>y&gve(-^-aHe5^8#5qQ zInG$>?wv76OzVq#MDk&o42BcJd-UpV_;K46z6!Qm4>Z^MEZyXsv_QkK^20F#t>sXu zg)g?^E{a$b%=ji6v&`65!IGXaDC|8-N#dCxcIxaJ6`U@E{f`DLSzJhT36+jmH^^<) z=fDKTVn~)|MdTHPXxkPP{zJG;GL!FBsKK!psV<=tzn5c_&6V&tE0Z2`}W&7rfH@cxV0=c>QvmwNJ}k# zkNaiLN~1vn(}ythuz|>)pkgJXX#htwqFLZ?ASED!(6eqOqc>Vvl5{g^4`0ZEab*m* zZYip`|EKHu#D)f$jZI7e=0iOREI@Np=iW{No7yIHKym||s$1Ouer|#6neSMOR${aj z-r0Wp!RpQx@9`wLg!8=~YU*r+A)ySB=;3ITO)#hgJ$?30H0%a5Y!-pJ_55Y8XzQkD zrRQSXeQW_me*zFehML>+F7tB$B2cC3+1uLIJhK9cd zpg0HTGw_ov(4rmy=fYQ;FWp!&>JXKuW##N5$=0O<30x?Z67 z@C_7hFn>>DJw^f`6ZowBFWPG!0*0WyOHrZx?@4ijF3u<*H0($~ydh(8K@yqB)W&P_ zvR9c$TTcr6v>cw=6zg2%8_(>G2c*3GzXVJHY&>{46v0j^pFh9L0}ypxp%3T+UM0{E z$fw=Z$73-iMZ~VLB>}i!>%lereb?9uB7N6B0DK}1U4(zo0bRta+`G^!zQAj2S&_hN zM_|dY>l}7U8T1m4Gqs-nFR#q{vKqyvRQDW?|KltMX3F&xg@s0*zCx)O*G~Z`8g}zs zgL#8h)*UQB?ovNOu2u@~-GQK_`Y@VUl~uwXRZd;D!*@Wf;DNhIKUaXm5S=2}5}g}K z1sksHbPo$QLICH_T*qXcPG72cu-cj#^8d7JCtQ3LAplQCK#$LEfW7i)?!ot4VArv> z=y%UOb&u0}znMN6FjNUQ%`X6QKOCdcYdK+t!H^jMc^FXBd8z;TC2JW`bl0b61U-A* zMdLM2gPG?o^hlqLQ=Ah?&aP*jsfahEU3M3fWNff=x8=5Le0uix{K7gfbgh!tU=-=2 zgdfi9!$r-t6wN|0qwP0c9ATHC{p`5$9A#XL^podSe}&Kff&oS9Gtp<~L4 zUlX!SoGJJ0Z$Ad@* zf(|NNeitv{&l&kvthIbPgQ+))Kr&yo=TX)E4!A?KN#-J6f`joL0F0G(5 zz<)5Ie+G)==VNp3Bsq_hYrhs zyo%<5uee?NJw&>+81-aY_YHY8^5V_u%(lROv-N;(L7|Jy+tl`w7fDqh3 z>Z<($6>CSQ@$|DMwStjwF^t-%LR1tusJ@ThsHf+fN1HGj=AseRC=`eGkRp6&-1B@a zg|A--kH(d9+9~@Xsf~+5DW7ms{xNi~HXu;<>v9G9Z?C$sM0|#}vo;7F2C4LX`4a2m zDJh%gg=X6<9q4q{r6EcC&w$b&J(v7^AaM*#CFx` zv9V-(cSLDg^~;ZM>E3wNtlccF=6us*MzJ&R?By8S$(|h-7O1k=0vxt-8tQr(YpUOj z?l&K*qU;r3bAR7xXSZDB)Ug86Y&E?IX+h)Syz*&3v#Im?;rF#N$-XDRQFdv; z-Ikq_&LKKgCw#$ln3e~u_*T+xSy(x}^92m8zS9F<>zUr>!u|*QORja=6J@`fZg|+U znv@2O-Okha8f@Qh2VU6{jW(zJbsF1fZss#4U2az1-ZD)Nn>q+IaqMhPArJNik$aQT zA9TGC5M&Vjq*zd@j7wVTO(v^XU>NN*%89o45{O%plj65@IqZNT5%xO@&=rs^a$s)K z5Uyr@^draISqy*Ee1%PouM7hb7w2fM9BH%4P&(^)jFO*+a(_Ja<&NTJvZlFAUy$# zEKZzW$r<&bpJ6Gn8IF;iW)#6jR%zsy1(dG_K1gQ=zp6|MmZ*TX2$Ow9U%*EWD1Qyz6eS@#-w71f842t7>uct4 zB##6oYyv|6*6QIXjhV?Md>YQcE)DPHq^-o`sYZ z-$uva6Og|zCmCLYToe&1j{w_V0rM#J?;gTFjIk1}kCjB%%XSiqN^90rt<- zp#D$6qL1-K2O`mS(;q=DyR7ahaWjdSzDTma`~Gm#JH%GD<|xUB(-<*?@@X2j#!sA+ zCCNg-e1X17GKUih+SvaUgo_A-13Dyfb}DTS_z9R%&5p}y0Z6&f(Y6o~pMqW3n1+zL ziEjrr#G|oy%jBF@xuwPQA_xM_T-UW$JlVdgIwZ4<@<$GSuO6?2N>Us1W@lOZ8=$iM znJ=F~p@oS2O}F;aI5t&I(LFSwFVL1e$KXY-N|-$ui0m~%J>X{` zq2J^G+N!0ysUiTV2!6pDFnE;=t7LoEfRSU%-%6<)0&tus*PpTNESW_D#yj5>EN?t5 z-PV1cCfxXs7|U%b8#RDho)4AmrX$#T9Ava`bI~!4qKYK7rOYq*VbV4+L2idQGvaR6 z`0~ZI1nM6SzBKA1r87L6aw_vnu9G{;rqFr0C}gF))yO@;JHKln#laR$8rsx8!%Ozj zC#-lID}7$Y+ZaT4`y=$Y)kgMU$pG5hn>bAAcp3WvPOlsm!iGS9x#%#b4!!%2bpUU) zpfD9aEZX&VPtz~j_W|cKHcWoi!Ey~iro$Nu$0>w6S-iMNRgo_D^(5h&8E@2qb1`Fg z(fV@?-coO-v&PU*&1KM-jLHisf5$_m)yp)ZAgyLJ<}WljRY_POYVv5Ep)5_|VEMst z7z3w6mN?Z{EfRq8_~o4a%$omHPc*OA#Ib3OapgRHW!S5!_s3t=sYVl$@PUo$K8t4nZf)} zG}l(A#W)3?VOPH-?6hlrm(BJ^#VthpE8dQY@31RLz^POZ&llHF9%BB3%X#FY)L&^`zBO@We2Cy$^*HrM}GQ;Kzk1UmXka1&Q6R={Hw@$c73V zuea+suyM0(i9-Jrg5!s%q@G>1?N^hDi<$gnROSYpYF9cHmn)MJD9!LT6tiaxnrLTK zNg6SbiWRXo;|;|2I8%^XMHrsBFCP)HV}-d>OW1R3?y2;=%w+2gsOYxNGK`1Ti@(Hn zwU3auXc;w{?mxeA{TSieTAl=g3;ZgXR_z!>8OCPOqk_q{XZ@X)>*Ca8z+nT1}?uRMuKn{tnuD^I2-r%?5LQtyxf~o zI~1#xtUECPKucVZYyQ_84qp!^xG*5jWGo^Ec$Jv8G8cA5g*xf5VMKX z=~QYJPjtrS`Our>3^yVq=Kh?k|ILf&%OiPI4iXvx8ljX=z@7Y(uku1cRIg<`??98A zhNeeZsias$@(G^1Mu3wc8d5Vkp7rfznJ>Q&Y`g%RPi=2mU9Z)ZzB9M$RJf?`RBnv> z>YWAuOHpFbF$6DgktGY@_KPCG%Co5i2R+kJ`1?pz_8K*VlTt01Qbbj0$dS^r1pBD^+KsHTd42>dZ z&V-b&Ci>+epLEkBFwlyzC6us8R`#&&8KPSAcv)1er!zQ?;9$>TnT%w_w9RLx>hhxe z*1Q7HkdSgOpVQb1LJ^Q5KtM(82x4gF#=Qq!VmQ5`mLN7{%_!h1h-r#)ohPWk5eh3sC#iX7Rh#B zC?}zx?{+w*7H%YJk66BQE1Y%Nb{}GBlbCV&b{2GW|87i(6DD1@qPX|R;Xv?l1>>JM zY>2#T(A*19(vSe7!B}&kYTpW7y}?JkFt(*nT#wR0zgFn;AxHjs7WM68oJgweGb~<~ ze;;=izlwv3OU*-W`R7se`3_Vc7}2Jbf}FyxDE_$!f}kW(S%M;$=8wgOMCnmAcJ@RR z{|JrW;LKJ4Qy7b+HCF&L5Q{XWBxWDPONj%FQn!lcC-$$3;Xn}a8teuO4yK&y5J zU*I>qfBsu$HO97&@RA~9{DB^o@R}ZVPC`iK`jHCLIuoT-P`FBLmWlMUH(uT~e19_> z)2Vu{v*)UPU6dA>TQm=f7jEP1=WGGxhou# zdnh|RCvPyO+5cO*K-*5IIUTL&Yy!BAlEJM(Oj46x^Q6=19RVIJD}9PI%1_y! z&2dSKM~nTHXvERHb3T9inmqcL^_gHr9NLCmH;?vvW7HjY1{U#;m3_Y{8nrEU*{0E# z^<#1blj){WI0tSIlB#GPY{ZtLmL=KCzi$4ThckwiZT?^W5W~^nTbWT6a&>qY zGX%AXLuC3QS|os9rg!};aTN|%=a7&HdITba~SusTBob~76QZS2(4x=zrA>)_) zRX%sg&@`QQC@pdqNaihl%@04aK74XM6zz*DSEVpY7s~%&h3X8jhg)cNcx#N#zWNHN zx6*}5FbBQ}$iwFEJ|G)_h_r0B+2U(~T$?g|v(Y{K)0vYg&cXEf?#SMKdhV|ZBxScW zajkiO8}>8$n7ykVS*$lMZ547IaaG|aV6q35*O|kt-#D?8*7wFtt*-JUy0_jtVvL=FS|sC_X|ej0<_x0H zibY|rRn*LJpQZ^!+5BeoQ^6|ygdNgg`!fViNcehMp-lm>PCipR{N(&p(2l28jSuMz ze8hk(|C%2}1HpJW95!wmz`6Df1zydGYvvw;7Gi{4imJj{6Zy&>b-8F21Iq*j^^h!< zi|7sp`YABu10~S_KVf5S0UDxBotoWquL(F&l1VD=^J17}hcbjfd0OvS7tgpZ>o43~ zwdK>2h4TTr2lRDl8N5{CQmZBA*i$SCGUHHJCT*5E6du+h%89P0N4kD3U+7q3F$eY% z6KIAgvxv<-QBJ8$r-azbE)TQ(0YKmM#;wP*BK zR+ktE??2GllbAz0Xf%h(YZ@h^fzO%L>o}Y^JfAphzq`)3yJ^2W*4^v!^U*e)En8;F zjFw1khrP~uJLhq;8GUu+YU)T`F=TUcw6NkKx_ogtN_;5!%<~ls!=(2&MyCF%$S)*h zR0Kx=`MdwFO@Qr-fYQ<4RAI{%f0OTU=fhMsXzIP!s*BVs?Y?ZCTQ4kQ%6@vE^xF~m z{cdGHyS>_SbYo**dvEkBql3@p^q?L1aG-$sbGYOF3$gDKm$k@oYBsqP1D=kL|F$Wvi3`ynyA^ZQ~D)9d>IncNnk{6dx1dZAdLKZhL?HuZA^3Mp_ zu^{oEH-=TIP6)qnLkMZkyTVV1;apt0eZ=Rh&EeIt5V}!=3dO{tF|8lKQ_o)skK^9` zuiD+A9xZR#Bgb75<`&SAfs@V;7f`y8xa2<|!WWzGK}i7+%qytdp>Z}3Eam=w3 zT+5hDUl}@mf?GRWQ2V%*>ZXeSJ7g05ODaeDrd6I}5ZcybmTPR^-yWy2r{c2NXi+S$ zgkn$Ppw|$drB%{AvhQb$qIklpE(CHFzS!Jtf(}YG-0C|0z)>o8Gg^g=2?uG~WJjAK zxK~fZcb(h5uu{0MKPTDmHeF*~XTR05WbbQ(GtB@iZ!>LhyV}S(ae*Y+Y+8A6;Sy7cBYau>oWZh-h-7M?&u^LiRm{_{DFh9z;^D$E*Cdc8 zXD9|;vq#A802%XrzUF(FcE2uzO%$SW|wLUI&f! zE|oVF5psEc78q1Z!LuBIVsw?Aj4MU47_r!|{82Ggz)2?ZNF2*hB@R1x{}=jqHz)d@FL-e2p) zmg}UebMgdC)Ua}H(tE~i_;H@B(eGl3Y~yh+E1^eR9qLrB*ONNs;W^IC5c{Ufngtz2 z4&ClyOt#qAxe7ORJ18;p%u~;$C>Ol7OKRDdD!AKyQu~l?KFI9xx!8rOdH3|dh-NO1%-`9NSM9I_xR+%T+aJxqewL>vKgRqyk0zGntR0W>`IKeGs-Lp>`* zHObhh-k^5G5Kve31g#fXMkyKpb3X#wDjC@=qc;*1g0;$=W*AyQD7*tRg}X{JmVf(p z+Ba5A{&GWDHS!?RWOvyFmEceesuZ$d75{u_|DMrWWV&!^0PS1Be=5R7otbe?Pjd{(4! z0I=W?f0(~eeMf`_dAHWJ)!n!QTPxP5g?SpG(JHS;F#(7Y!9O`M-X<_9EL7pFUH~5JVlDg@VU&Mq1HxOAnH(O4FMS12SiyJe%D*^S* zy~K;?7&me-R1^JM<@a{I$-?M(B5NE?zr`jIJOY9wgP;9!N0iYcWHr5jid6OP1{jek zF&Tua^>R!9mG4YZk2RNQ&1CRYY@HuWz?~ELbxaE?Lcvl@c1h?4QyDdhKxZh zX+cbzX&KH$l$8u+bCq_9bspwq_`ou|{=9bM8mk+l_T-(6VvhB%Bgq%^Rf8^z$pEL? zH}j1(hr*doLNVQtc3c&pERt909=u-lAjK|#4>KY9-lD)lcQB2)?eUheOMzi}|Nq=v66NzOw5-+k@m$30*qXyFr zoe(dAe|EqOh9`s|nEDD%nOSk*783^Q_*2*r*xZjHGJ|U^oqF;~3Z5A>-#r(Ku1x+! zopSP+pRRbtsxE=F7$3QjR3pEVuSdmlyHFq#(CUO{|I%3yD-2$eHMH>heYQmKU$_}z z-p~MA*5K;zIn8~`hJ&fzug=Y`qy&sbE^`}x_@rU$85rGC<7bac(26=DbepEJ2LS3wgatM*9eUYQ-XTAA&(|Z#ZuIAz^hR z(t)}Ke%i;vF;i7vi)&}7)-nEydZ4tDX;0fi)kUbXdcJ-9|Av=c{DYV6{rG>t%d9oi z<_$fDip=;X345)KHecGCBG2x?WRQjM>vzM){_L;GD?L`^X$d*7xCcgKGqwDo9g>Z~q4@RfL)me^5d zecS2?d8Hkn`v>a!PjH+be4L(A)m+S(%Y!*rtTdZZz3;{rW1G=pgjkg)I_`MS1@}1V zcj{jm;Uk1P=ksNm^xQv|=>S^>>XmuD;1PTI{MdlNs~apW5*An-Xpl%6=t^PrP6FR64sCevb^Grqu|U$*++O$vtMk;JKGM{gTs4x=m7Uh9Z z5;vM#=XW={nsLO1oGoPPxq9Z3ib0h&?T(ZyHP~iuklc-+e*$PNL#>10nN^(BCS(<&Fi@TmWR;-jB*gDqWT()awjjUwnkx3R zTqv7sJH0^j+lhL-^9tb#=rw*-9oPVVfWy`?);DL;A>x!yj&*uZckXY;SQ}AF z4O(*LLlYOV9{y7XK2A!G=B>Gwt)%9g8&g|Aj^U47p#D67^0xx(L()5#B5|ySI){r; zK-74gPKH`Ub}NJ+tVB1V%9>nSbyEpw%|O;?45&~f82wh**vQqIak%cavVwdWv<&#W zcB^7$_5InGq_nckl%85#FTf+xjtSngZ7bQWoObSD;w_URu)sijh05UZQbiFClpn}5 zC!~lx)%r`J5i)dts#gY9faYnK|;72httU7*w|jbLEI z!DJ*}jxAmZEUaO!0?I6H~G`yK`U;jERK(p zw^vwNzEm{JEV%)X|y8?E~H5FDF z=WU92H#(CYsulix&%r+q=aOGTWEAhNzb;c5AYC3vP3Az7YIkN4%h8UB@>$ z&yzTC|F8~6;WKqx5l7(%6JRr2cVx@kX;Rp(GRsO_xa5BC5WFM!hTs>G6P0eqT!-4M zVLJ)pN{%lecbbQ13yuvzEyfdemk^sU{H4p=r}}}zIQ-MLgH`ej%7y_QcuIyAQpPi? zF1I?;gD;@$l~vnX@ zLZ=Gn_Vw=H#mCbA557A(0bdT^m$tK*wUu+3j+TQrl*pwGufy)s9p{biWO(8=Bq>v&v!u=hZzYg`^ZRxf_aSxmhRyt^aTcl zd^Bt%Q6J8ib`}l(fI*b79SB!ju$sk{Uuut9OiD=M3?Z*)j|FCU+!78?Nw`d)5HRuR zXzC?2SBYzi*DF%grfu}-MFB3JGvO%xW&=o3AiFW))2kC@= z25|^Uc?Gx&=IVkhB9?0KBIL6B0(j~e?|sC>V7N+F3;O<=2esIWuK2BOCGWiCeyiY> zl+u~|RC@~K!o-aB&N}i+`g>Bk>K15KFKdJ}lhzASJckmh6obc@vnc;V8$`i~Mi!IO=};) z>=p2D`s(7X>ukW?^To&W#q$2){Oq1m@B+`BO1`5))IHT}o=p25?+9MgO55A*kN^Fj zC0ZK>WfyYKWvg+f-enWrW0Z3yy`mUVM~9W{*Pg#pAR$7eoPpJORoP(-L|rSaIgb>p zlY7pb*(o}$;m0|F69`0`=5#oM!{Pw|E~mxV zB*tOR6u*%|o;924rwf8k^>l4d5}3Ham2vK&8J0U_p0nBo(s*kGUS@$*_yKRC7`Jq} zy@Bs{+^<2qd}$?Lzsam(wA^IVsgVmyx?zo9{*ehgTLua^xl>U!-dm*Oh<^j+4Q8wO zX@x)8FmZGeCG;e@J?JD@D76n1Jy57EA8f+yJ{3jHb0+Sba%3)(Tv^A`pcs#ae{ke< zsSR@`H|11?rd=p+5V)64{7r*Sc^+Bdh(5~Gr->EvUlDOEiPieD|&N%+ruX{Sum zO%+ZMkwCgj)8a*PEb*5YM@|g_%LX&_rJB_BYj+Ma^yY0I95KpJi4Y;l!NN_QTgJ-x zW;$bEc)R-yzQ0V)Bot>HIQ^mReGXL_DrQsj<@UoC`f-aVU5Cr6nnb{*%ZesP^OlMv zCLDv{c>(sNPwq5bSnaaVxYzhm@P(86<-f8^;33j-+=|u@!$n6axx}$Um~(fe%FLWz3xif{JA@Ojawh{aJz=P zR0wu_^Z=-oZoNpOq%OR;cEr_Uqg5qbaL-X+nESxAu_BS#ownP1*V(GV&7aft>&lHl z>(dIZmoqR??0Fg=((3~t8)HG;VE-zCm>QAtijW(=g>BG9A~pHYk7)6?g3u>hGbpn{Jl*O5@g1CD(c2j3IS z8h896i&vBq7Xa(8ZxP2^$`9_hNF=9FXh&0$K5|bH(}k~tfr5py2ssM?*&V6u8=M*_ zXaTq~=bEObl1fZPSAz`J2qeQMlZAm-gB(a+iKW7@{oEKbS&Rr>0VP%`n!tdDTnRPn z#j;9@55y+1qvc8AN0JOBu!yR`2B!p(S&+%%!>hp##7v$ABX}d(rpuATtHB3j1(Su5 z$&$k>uhhAZl`hFr!>b_#YXp;}k`ZVi?0)8)+fqOj^TP=vn-Z66tFTf-3{D9qD;~Xhlg-Lo3FDriT%e7Xx4YVt@DqXslnTD%*Wj*s@c0=YW+HR z^CcK=ppe{>D#!z{_-Xw16syFdTTog2!{ zFT_0KzO;Q^>;LVm{q-Rr?8||Jh>O9A*ljkSTYz!B2>bGl2bQ}OEaf&9FXmJ0 zmuv^WkptS=X7b%-ekTWzhc$@8wqv{sc=cb&-INkX{%vGB z`IlW}+ryefm;$YFRzWEnH@zu5I*PZZpnJU9U)dEBYO2l)Rol^5 zdJQCK5b4tb1I#*gY(#ljXt!~<>%N8k3twS)E|KJ~@G}FrG-lW6(VyU4Q$fJCNcJ!o z3*So^1HtNFinNabSgndLtZnDm-&b?TCq>2`d%4?kFE7g;0&IF-HnP{)fKJ1|S!d^4 zjjWDVMz1P=2~T&N4hNBM7MsrANtyih9Pev7?u*BcbO3|Vt?UnFfloV9LzEp^y_Vc< zH5D+Y7rrlv9d~DAKKFM%slap_H|bH`dIO^+xUAglslmOc`isBzUp}Qe;?s9RJCnxiH@AnFq%B`7W@XE^TzwJYN}`jl zI`%cM#;&b{+Vf0xg~Pb5$(A8o)2-(O{jJ8dFIL)#W%5SD>z!sjen0}qn;SI9no8RI z4;?gq?x_7r)AYpta;*E=d}yr*smfIpS4uiN*nEw`%%S*^8M8qF>-m52i&jEnnH)T^%XoKdm*M;A`~Y|__|CTmb+P(%?DW~YGrh33~b?F-H8eu zp9%Q3T3y*Ud!d0AB19sma0Vw|#=@%}?%1e;yDlvZl>>Zp+i$&JkSDpFbVXQ>E`LmS z8&2C#>7W8jH6^GS=XsM+TTQ)AzqjV_XMSRlT>N1UBrj8*CwoqGQu z)(?<+l}-|JEG?vf6Wqgd38lHE8#nj|VEIzR*Yg4P-IHWr*kH8QJ}a3}3QpDe?eM`u zB1o6LIj5>s3B?d)s(+;{DqlWaKVMa<@>7c4_{tOEVO14a%QiV$M(Tw#DWjiJvodj5 za|Tp746o=^jUP^BKRGY1n1XR=m<`Y?Ux0;ELM<;L^qMa2kJde9jx2RBn{v3u<#xod zBpQvaWiFY_(iNZO?>L0d^-U(6dH?XaJRBxrAj0N@k6y(UoA096{kzb=1+rR^AdL!W zAKBN41I9fOEQwtas`vjI0I_J0`>0&`amh1c$>6E3To*)~xZGy+)}5h7pkuk-fzwpE zXObgtPW|F)ZcMat?9cbav>d1b?8}QZ_YcJwNuR21f-oZF_uUC@$~=;cUMZyC1! zQKllUv#M)7KTb6}mdlkx%Ka|bx%T9vCwv*NxP1;RsCYT>Md?8T-ieP@2$LTo5b?Kn zxdeRtENeA+~GeK8pG2-((FRw)a~8Aevh%R z+7?RUV<}62RWH5 z)1}dztA=ezl7!g^xO7B6)}p5NsK6~CcNMx1b-|q*{WMWiW3cL`WTxHql(J`#wupUW_(qC999?{??VPohxY`a@9`b_Vk179>SK z@c1q%!by+*^h3}X4#Fl*QK#$OXYE(%-~TzE+3ip7T_O6@0Z>Bf1B%bp_i>Fs%a3pe z=wN*;AM4p$QeMSThg1{1pt0ZG#(_lLvME@e(3MM+M$G#V&P9*FTDc0tM)jwj%^;ix z8FjoNnM|vPnlI|xq#W60m!t2M>5F4a&QFtIq6iy=_u+Sk&vQuS<4I~+Pk+}zVW!aB z8nd7vTBc!!b<%htsD|j011)#7 zX|Yp8oiJxi^a~^D?d{>!d?!U!Xuv{6cszdR!R|Qr7F8O~$H1<(YUjF;?uH-46n9HeSpK0-`arNzf585>!ps6zOKyOxZhfMr`yqg^U~C5G|pZ|T!cCI^L1hiay6bIwrb(xh8$X7D#u z;IV~q^KKP;3r!(r5t}xYhzEKf7RNO&uwpTiM7>DJsQ9LOmKWE7H`g^aZ6{%`@~ckQ z&cvaEZ(OgRrCXRXX$H^HMBHVg`lV~#m+e^$AdVykI?UsgAj2mUp^HSi>I|QOl)ejH zA&l(-Nn#g`w!?s|m@cpKbJ6{J5rh7z7g+VlrJmZ*Ih)@Z8-1#o?qKZ^!2d524_McA zEuNlo)IoIu$4w5>rRuKBi6`AGqZM7Y-(HzDtFg+9mgOpBnpt-ht4OZHD^<2fX+Zi7 z&rxROYPRyC^w3@9D)*ouUtUi4)6rw<`lCNM!x9?!c`Rl>4?R1q=q+2fvfKoC=oUj& zj0YPTqC{MI5%B~}_x$*+VTki~!cI}EZ8+5pIFW)Aah6>SN`TYUbS97GHIEZGta9ro z4hmyuNa2_E(XoGFOy4#TCnX>O2*4fm8AjD*ybv}zUub&W2N62Iw^>d^$+ z;&W0GYFxZOM1FbX5pmc6lJ(cvyl~HmN7iHgv9fgsf5sAa7u!4^I~H2~H&y1jFWX1L zr3pPtw{bngR!0%`VJ`v_seU}T(#5($?ex3kBLGF={p$z_fIsVhMIHZ01(LWH`Ogrt zShZ$}`tflFjYx|ti!)`n5lq?{hP0B?{>kfW`{UUEI&JK3jCOk`{a_S{gp@7f>sVh_ z_t0)0(6cGAe%6B1gqv4<`p10iKEQW;)}%JB8=Eg%i3;&&+L!J6H96sO>Kn1LhX?#& zYFaD+vH?1Uvm6rU3wxkrAJ&YqAaMwPJ={S5#G0I5xzxOPPRV%SFf|t^88tbW(i=!8 zOIt$RfBcTZ$xE{aaUrYs&CIl!iWsZhU8P}mpkWja+fhSo4JnVwfQB*KUB+a9djTXX zu`#nI#}9rsF~eicZ+i)7(LWbcAT_96@JE2bu$m^$LNPqJ@M7>@esD#$6q`zo;#7=S zfz>k*oPoLDhVpAezS9t@B$v!VvLyyK3_#8x3}cyQeA0{&Xq!ib`SB3^eVCfhecvKl z&e58cCo~7-QrYvh_tnk%J;D;Nk{yIuDEm&^_e5Hme5ku51j0;qU!Isyj`vUYo#+6J zP_g9P-tq8)JBcF5s7LS9nKJjp@2!>t36cosJ|y1YA3s&{xR!cg3afTjH8I|<(D?BN z#oW|qAdtG5vGDj$8u&O+R=J_tPnbJyn2|P1-dtxj3@wW??R&65h}0btD=7 z=mC(SD659JeXyYObeV-?W1&3i-=$Nd0Goie6BWIVyRfrGFYr=<7>T2aFSqMyl_VKT z=`z9TYkDTZg@W_*A2w?cUGtXO5ZR)10SGX#eO`l zfB1sXb$biOEgs_8I%T+ga6H-;6z_a|nACb=OB3@3H3R_XI!&3iwmB+qhZijiJ&!hx zZ!%B3&6kApQ`{;&N}nhY$%&riFUu*NLY^%%QM&l8TBV!AF#1KD{7|8h!Yl|J66k*& ziCfT-_!e9k-GWz!y<8p{jX=QS_nlcP-*%y&ux>f7Jupa=gec)oGNwO*^vZushmDaX zvebP{J;(_g<8&#Zp(~&sT&*4v&*f7!!YG}p2YVRCIv-e?Iu6c0l`2&_Z&ZQa)`iK{J%*Stf- zNXq_sx;;AvehlrJ+*KYlh>#Ez;j*G~eryWtq`!b{nIr+G4b!&e$*y5gPHp<+1O(C-jkRKh#xD#9DJg1G$u29KPC=oZ&A*N08@-He z*=-)=V<~rX$fzI-4gVp%gc3RO+nm@|XMaDmEh)m!5KYeHIf)z72~wf_o%{^16A%33 zyi&3l{Wm?{Vtf!-1|euSe&m80XyqM_O6&p)!Iu_2B6Ox#2H^|J{Fjl$vQ29ug79$8 z_o~-P>|#>meRw!ylHTnh)!T~Z!E(&6bM8^7$Esw;JG-bW@@I~uq}YtQpG)-#ZyT!m zAQsUtzP9vDRhH~PN}|C?pmr`*GpyjrrzFJGAbOs6E_G8?2CX;x9}CGM;w~;JAKFjW zo|BdL;RsU+wGv)l3rI96NygUv|IUymjh~8mrntqp4C4wcrcP$<#o8S&K3!-l4ek4e8M@U4p#cn1-g z!7Mmesx{7Nd?P2=cf#dCVZ$^Y{nHT-YX$y7a`())9qmA`XL3(cI*T_EHV%_XT*-{- zgiKY;Zli3|aNJJ^T+ttG8jYV#aRb6{VdUHqEp;VTBa^1%Il$j->jPm*YWwo1zSu?Q&{FltZZonPD$sUCG3OlfVM>*wS_WNWLoQN z9kq;!o%*T?%|h1H`21O1y`MFsc*&+a-?vT628E9j3eb$4B@fEkFjfE&DPK0sruDA+Q)RchCeQ_kgZEE zT4~Vq08Nj0G8{T9bCFcQDzdf(%@Qa{8uEUy1A z{PHP_W2rlC{rPTU>K83Nd{6_d@M$m_9+T8KN5P^6b@dVLfrwp7FmEgfi{V7%3aJA0 z`5!3|#y?(<+^2t&-WMS-%t~O=8&G}jP6e~x`P#wO)F`(GfU*%Vz1_BLzn_g9be}DR z`-ccxs5|Fvc0|-2B3tA^vA8$JI3M~0H6C5Rs6S?+P`8l`9IS6oG?H{YGK^kxjSvW3 zhz03*rRR%pov;1XbkNlNZ0(Iz;s5q@$o)5)hrK^=dlT!^prWdSUrXTiBDgX=e?4N2 zNsUVKwnBOiF6+5h*Rao_5|t)0D{3YK1DL7z+s#F1ApcSMz{9T=k{$Cc2Gpb|KELX! zti?j|Wh9xxiizoC!o+z8+x3%NHk>E-|kc)UoD+RJo zVO8YnGHC&!Z&nX$KMcG&42>8UqRa=mDBRYt=K!gHB=?PkFTCofZ+)OVE(3MtLv@sR8WQ-~`FZ6d7(@yq1yE7Iaf&$puPd zz%F1BS`tFa@j-e>Xp#YRe){01`b`RIRng>(He3$9+)1sy6YuG$(x~-47yTF?RtJu) zLM6zz}Rq>`GaT*q_QYoyxC2XcZUR zwEmRVYBGV_6Hx->`ZS^4dNmzSuWv1uwOULwO`q4D;eER;xraHjdNVI+T^U7=F6$2R z1g%dhhs1^XiY0Vos`avsg@&E)YV=Aws?vr{y&gOLs@;ZqE2^}v=xa$??H&{#9iBux zqF2qFsm5_XqG6+*u2YQT+EIoD_XMP|t}PtIECwowqN@U=N<23vlRi&w9O|&dRa_uhu~6uj=GWIWAaud%jT&crj8rjy-!*5V2$Yt*slC9QGmmg ze|q-|U6Ti8lTfZVkIlaX;r{;ulfYOV`x@p_2pCR0pSUMHeb0J*`<++X8S6D^C31QK zux}0r**$$W)zppmc(2pCzPx%RWz@I@?dgQ?gJj?1|1${ggJ7i>WBT5KtitDMcfaEN zaTi`#Oj~){r{2DFe{uxTBnT=5(XIZ`9&%z^v#ams5R~_aa*SsVXLBBU*~O4@1oa1V zfgm1aj~8oadyF7-m~#5^KmZ`3;FbH3#A$3i9~gpmMB@}g3#q`997|xD{DXA#1%~_b zH|nrCF-g`BBT2|VDgNC|UwHeHij5R#-Vk@HV~Ubgf579xNzAmv7pO%aoG2MTip+OH zvV0SVkwpwN^IWjgkT1!H+B+YnKJdErf|L7o+0-HM_3JxpNrl{^a2*y9z*k(M2HtFC zW^GXf^+`l*oACnVf;E`*YLsvT6j)oOxJ`q|ZA2hgOY&)O8_{hxP;^!hqEm`jSeGl| z)YPB|V43zI;>PJcB$L&O(sSI&Gck$M%bWyjiJ3R)=WY$r zFPMth?*coHOn;QW&tiUa#{8+7-uVe%XjZ65yGSdyh~Y4G=rsmT$!_dy7yLy#{Gehx zmX&Szn49E&SBXNoP{3b1q|zX+F~X9Jp<_-OwBW$FiR>;7)=&!QF$qySoSJ;2PY5OOW8M!2<+$ zcMqPp8)trvDH_zq6?E_DpKGgVTa+KI zn}5iVjq1GxiFl>1K@YRKK)Vn*HU@sGbs|6TRlWRwJQhz!4^>;~6D9fMWn4sdT%~jR9jaAiAei&y3f)d!>lVQf+gdB-<>;$tanyOSvq~ZToHHCNX zwl5{P*8-D{PCPmm0{J8cpX?B1E&TFH##CWyhP-*TEa3A=VgZyBEsI+|oALAN^&uXQ zQ$LRdt-Hz^3C6?|lKaXU>d49(qX|u&s!cSjlNh8EEu#qr(Qg`%{l0A44;D%*J{bEW zSbkn<@Rko&)2X^gTS&x*>wBSXo&QlWuCV8QtLyYmifSLDdfH3!!+e?C6mJ%o9}jfZ z53nOXVWt;Lh5-;r!LZE`fY-F0@A;|an4Ln&Zef{H0HN)Dt*ZS7ZCnPjoBLcYL}LP!7F z8;qHrSk&qN@@OOWn$ALnBu9gdWeB24OJv0?!zEe}#n=(G%|h3@p%7BU1<_2u%9ar! zx8G6#19sBE(WTm8L|%vFIzg^vf(uA00@Idq)WbVL9rX4~>DzT45!Ts_(0Xk`tZD6O^ zXP})c$)$6u)pZWRbK2oDWI5e&6$_;?ME3_km7_9>*kc#^SCpbESKxH>Z9Q@W;%z#7 z^|ba7dI8y4KVXoPdVjfo3hUTw212th+VbA{R`t4xt+jgKpz5ufJRnp>Kt**IMmr_l zYCm$fzGMpoV&=faSA0tm&HB(v7XH%4<@D(%%)Gq+rTX4xGI%vQZz4Kg>x6&|hkFx< z`=aJ~9i@j!MCTo4j>o3l@_+&6NBIo#^Oj^KO~C5xeenuG36~&}MU8miPoc&y<;RT8 z?ng#(Ey16NP^~~8NnBtr^;Ya%K}Tyoctt(EfM?3lh5BmUDX}gNt380J-b}<1)92W) zZk3-}V9RXw>mEyztLb+gDFY{?df0DZs5#Ovn2<5gLNDe>bvefFNI>no#80E=qCSpL%NK!e9uDU&(aL~Ggh;0O1tp+!RXFy&p_9un zx@bl;oPB6xYZtTm`y{@=L4S3k?hCN2G!Q~>|3snOd<%{!1S*w6ZwVk?U)`o?+Hfpt z3H05q9NlJ6Te4BtIowraBVS;F@mG|oJr0TTKg=XYQaeO7i$ZH&xF~kf^rf^oXnSmf zD`&>WsZz0VW9olbaz|CzYXAAzQoK522N!S0@1^dK(;-Gm`Hu(MH3pSqkQvT+bnCYb z!NvXvf$kJwB?z(QS^Gj15Y-0>Z#ALQg%;JZ2_4+G&A;R&nKp`W_@r(6C<6umS#L|5q3xlD>qb!6%hL>aP zwfF>`m&PjA4~2t}$o?e^nig%_%^C_(h7KJEE|Ky}pDa`%jtkd3Z~3pJJDz{{EK>t` zre#@j4EXH&nF#ELzXMME?Np3FY)Jpa(LeQSnW<<3^mI5GJ#dgfc$|bR2jbi`r7I)u z3gb4_`7k{Coxz8M#NaSAM`m!DBH?V-Ji)t#`S1JnD5g%JgagS}aZmy-kvf=d`jrCz zKu~b~spq?;?M;dG4G>DWz@@@?!y?-u(Z_7(2exRW$d~^z zBW1iwhW3OlC4q-3szV7$s>iQV5RO!iw;E($H1hzHc})Y+EI17T{;Svj1PThNorqVlX`M56TVE&y#?CPRFCm;VrP8-;6K`*KeeY@ zzN2FzsBsjChF@9GTf4dzgn&v~g9fwo#uBy~oWaQ}KXX?|Ta85qq)7bflr`88qU}62 z$d{0UuLSV;@EDylzdlKk3>Hh0oYSaT9|a3=eB03Hpm5GqyzB#a!?*KkJW){C@Rp5l z=p5#LThC^?JyzID_?m|f#E=iUOCq&|ShDMd!F-Rk(2Ar9k-Xj^(pFi6xYdq@N7#!h zeYq=8JU5J-c3k5qLUeb}dx|ldYO_2w2j>@JmIxpcQ7sEZBBJOmRMo9Yxsde4K6i*c zF~@)SHxR>kN8q}V-O2AeLBrIv;!LC_5+m$uHvHCdc(367Vg=k^Z=A8Yu%F2n^D!cX zH$GWlvF*v)4)^M7pdS8eEXH0XBi{@7KMF*C{|ABS)Op|VtMw4f2_g2@2stG7@M61D zM?|1YnxOt!mh3ByT@wpoBrobm-*0sn)S9)_^+WhW?B_>C^v}k|>TRNMv5s z!8mq0b)y!Hx287gjGfc%V?&U~pMmV9fr^7FZ6QgeQ!%|K2fLhI- z#Q#E_T43|P;}N9kR?;B?wid@wDzuZ`i09Pflu57&|8YfjgN>B>GSK*7HA%Mt(|NC`{AEB#DIxm(Go8u{a-?2^&_Wd zqn9O820)L3IY?VNxtLTggck1lRn9c}#|-rRDr7C5#mts@&GoBQUC4h(5lBEnt7}hKY=2+UK!}k^v;ITUV0~gTrF;gE>|)h zAmIpV|E>f<#c!CR)`UUq44alMm*4h8_lI2s47L&k=brw*WFqmCK=iu18Mh%>lMp-$ z(oAi{ua#q~tHA4}nU)yl9^kb200kaX4Fl7?vh4uKV8ut1elQNGb>VUAUrGX%V70zn z-V2RjjGeHWyYGuZWs}_px89>?|L13agdTVsnj=S~wxhFlxg*Ly$LD7WG6+Sm+pp~| z)Ne*`u=GUieP56f3^B3S=3cx!P3w*-f1BPdtM*C*x2v}lGkg6|`RAwS#Am0XypNY+ zN5{5HPh4stAe_65f*!axx<72<0P?fqv`Gl4MdaCErVEMZMQ1<@)-9jm#b2MC*r{m0 zuNZhK&JDDglJV~>GNPOnSe{$*cO=@bEeRvdKtuZ2TUT|A03B?A3nx;xTAS9Om@kUz zXuttbGH9reQ!=_b6!p$kxfKjCRFRTfSx(;bqz0kYCf(w@Fyl0pnd6is$ zJ;kzPsJlz>Afd0va9>5&P$O6aVa{jgPu*~YluGzS@C%GNXtZ?3%lIdzN{a`DaBy~m ziMZji_igZ4@6uAS%Uk~;L9UVrDd?51W&n=9$lD&s2)qA>?y7SPxr<`OwWq}FD$Yq% z)jM}3hym;rL20oH&M*aB0vBP8anlph3n76B+k^Q2m*WfR%0xpQ#oqt*5&(aII_%t< zX#XlYTx7;h(pSorCVpJ!C-1)Ae4+{_^jCv-PdEb3p&+I%nmrQBhxu>bIng zZs$oAYr@)Wm;7(IE|8E8MDVCWJoU~U*-EdzPCMK6a=3K^jgpnY9pvxnJoFe`Oh{b} zD2qjkS>IY)-vUdo6WJ@Bl`GXp-W6Y=4?C9*f4Lk^wh25mK7l$s;D0?|e{1FeyVsh6$S#EXbaVSUQs%JL%zS{x)hTQ?6u5? zz-u2#53tJ&&xg#zllBGJSsapKLE{ zKkL6sH?ND>U`nAlCLdZ%Zgj#^xJE!7TXZlVqXqh~c{MdO4LifVt<00!rJiC*2;n4B zjkLd;mIN4MmP6aU>~$N3VEe;<#wMOPvAJxxp4Svwii1UplnO?zrHl3`fN@yTvDcQRBDnZkR*Fq_`q@@M@3 z>=7W;DChu*%OCl7X z_7p&eIS{LX@au#(b7#-DxreIok+U=9wfgl;_N7gTjc_;Z&b~^=uF>WD3u%xH)<$H{ z(4WifJaeRzEzt`RX6gLIY1|;sz%4We+5~Gmh+S$z5@)XSM(Ov)3ewlRn(irSt@RJo z%q{+ZsX5-|=)QaZz9#fw=Clkb54948;GS72L#0aNM~90f_MVqH3&#Sgmia0CAHA^y z`(My3{PoCJ@Y4PCW>PY|c5gpbi8Km0h~$oR1re*t#>V587E5~-jn8m;3F@#@SH~_Ba4O(mznjT#x3N83GOaJ*DP5oD%Mj$R|L3g3fq@Jf-K;V|&-=`VF#~*uc zX|*fB!X3p$xM*n^Yg9)n^z^lixAkH(yoQN(@uO5OVv(b{oDdO5&201##_iE&P4;Ci zupan_bXGBZ3goxlVi^@9+eHkp4?}!zKQi%Ip8tKAJQRBdv0q??dm+C#lCsa zsb0bNxcQnZm1!^qBy26O4I8~l5p-QN*HlDoq2UtlCjCY~J#VVdAmAo+&eRxta;TgH zu{;cWoo-^@cRRb>Rfm6looF9F)NU3ke!#}Bbi9ABrB2f4_CoEhg&IzqIPr-^8xA+Q zd=36A>Fz}jgU5@sgBLLk>{<)w1HnPgXu^a0>Ztx>LIVH8iIf!x5vKis5ms@g#V&=x zXZokX$iNK_r#BRe9PWzp%WxUA&}42jn)k!se7Yz^aUmgU^3eNRb)RdCl#G&3n(z?hTEeoJ()ZRGA*Y>-gE!h4wmYv zGI<1GJSEHX;qDjJMUn5r;Qfi&O_p|$XT+o8#jwc&x9&oM`?^7lR3Ak?6ct|ouJW-G8i&Qzfgi{l9^GqNBQu2Y&u^=F?P`K5{@q(|cnTf*%2;7;8 zC56AN`W<|)N??&Yt@Y7OP?|Xe5Kvh;3XRiohOBgkPc$h7w{`tfA?jm=_md?Rd`co+ z$zz#$vWNoG*Qqbl{2Wl=q?UwblP~q=JM}51j1V{7OZI9JYi^T+GNYLG(3xv=RVpxe zPe=Bvz*?@s+^|Ja%D2? z+%eG)Ez4H&c5}1>YHX#!zn&_ek%TQyx}TjUM8+n%dA7EE&?4six_7U~4;4En zZU?T{Z$JFs4BUqjJ23hOI@!Jr;P}^#YnXPy?3M16jkn2wrZgk++Q)8IK8&PGL7y#R zvLjq4JPbiopl+whYC)OWn<-)7X(Z>fqi_yKS^D`fYAI{$&CmJ9 zpLboPp?{Y9M%y8H$|vLh@{-^E_Ix~?X3m+013r$oc^K4=HZH#LE%yI2=8B3qPY8{4 z8Q1^k?Y2pxl62DDl)hBSZs$gxh|--aZt(0j)jCrj;JjT=Fc|TU2F808zCs3#hZToxKa4#mYm$4 zBqRMs@~tX7bhq&Phpg;m!8sE-g1I#3yeI?e?p_&yTJnVt78!JhM$`n1^8 zDL6KaTt(}i@27r=fNl;>#Y;)U7KFjw#b~RuT$Ml8@fiYH7bqYOuAUX{6keoO$5}xL zf)mx9hZniKPN~H93^pb%X00;FXj&a7OQ zy!L0zT$eF?8~3%N+eTjsD}D^+!TcT#x0h^M8tibg#mu{2y@o|Lpqjz=tRv!OH<%RW za5L{h!isxk=G@ffmDQP8kv;q#s4|?B$xJSbBD17@{O+HB+Cr|;N2hwEwMEDOnzHe2 zk#q|h77)aAr>L>iX_*)SzV4P5^=4D>Kbcl224`JA5!f;3wH#zj%{5#&Yj*a|RWOydvRtvXk3(|P>U{9Pbg z1Bx#=tK9?N0V_N-Ez04Y?m9aeTSq+cDSG(-fP~q8#bP@HLQ)h$gMT742UJtQ&+@yX z7fS#}Echx%6&qZr8~h7^xTgPC3Bd;+C#R^2C)Uo6+>m}AgL?~CzQj*<#_tg*9{LW) zFUMI(p(ED^D-4gl>v!qH%V1=4*x(zvaWv*B$=^h&?_KZav#i%9 zn*;6=yq4uU0iCdnVhdDE0Uf3EIIQY-Mw+JUBO0surQ$Ek74M(Rb1Gg#lYD>nZp$MV z5dMIbR34VeJx~|W!?*l+8Ka@Ci!Q*kc->S zS2tcOo-ahW11F(G77>ldd&e?(l~JTa)}t+eLz;w%h=RR{x<0xk^n7HLRVg)SOU)FK z8xjhIj+pJJ66;dex!0vYrls9zk%0h@#Fbh5LA0xqMZy;|c>~Vh5NOgHZTdY6FaXT8 zi4sSOYdTfbLr-vJr#Y`lx*Lx_qcV0(qtn}gH_n>f`SN5pvR2yL*e8EqEp@U`|3we5 zwz&8RTkn{+rfe&l8ks6B;)Ud!;fu|?d4XX5ax-NGi8U}#e?+U2j&M%fk@#sf`{!~v z>?9_lDvjB@1heeoL*Q)5%#c@e4QOvcUn3;P2o4&Rq*>S#9|C_WByz2O-F+xz!$mQM5Q>!GzF1Y3VeO zZ3%y{=U~M)wkOKY-v3aXrTib9@zD{7FAie`bPgpAbIz~-MKcB(R78r|ky%HF80Ah? z*IZ^6F*+8S4(I!(b4%dS1&Abh3;u^bg?m+Nvnno@cyIY_#yN8vA4;!dL%nS0hz zQfWYQj&4(>O&w%gN_Pa$hrhCjug)QFXC4mDxsZvtI&=n zIB(=n#<2D_MF98&R8U{lKnTTYD~1M;6+YbuhK9;ku532Q`ui7!}ZVp=k2?Gjc9`}<=0ZZml0BLfSXgAPZIQx)cQy18O{I*|!@M@%hto)nw^ zxwB1yrRg^3NXhj?Ml})tArH`9FWD1XuC!-qG1_HAmm6 zv@S%{jJSz3Qr2uNs@)o?GM1mg1m)b|J*9V!EGe_b*36Rg_=t3-xy2_RHq|$>1Fq<~ zTB5EQ*=V^kCxT-O!^$KKXH>G8HO>EUNT17-R(r@bFJ_r?HV4rn?<}NO7u3hiK6ULP z&jV!|N-PpjMT0`B|2O1QLX&~Ze~TmmQHPA_WwF9l zA1sGKs3rA30t#+wdF;>rK*FtalXZA>5#Q>1V@PQbEdF<_wM2Z!kwq;<9@T7#_fNpr z&EZAhKOz7I<=KDKr+5ERpAaV4Xe2y%RwHijdbCo~D%RKCzurgVMd~O{@V zs;_vy(H*q-)$!BZ+JVl;srA}83Fim<;M08!Oa#Y1g#2Wz_6s|rWR&IQ+B;?k0ez$X zA=(qE5(~>DL&a0<3gSrbT)!K$nE*Uvxep+$CFdmk>=Obzl3F3@wvx#h?#Y_?J;-+8 zMIL_4wvp0VgY1zoba1OIv!wCt+=}bwc7Glb(8=6lVYKnnT?3u3cbq)jX*vUkpO3*d zmqwkd{4LEhw|?Ll5(|^p9dzBmjD|^mo8Oe?L;c%?t_?Rq4&Py(b=4hwT7iHS3!qnr z{V<)#1cnwPnoN)o)^G2?m5bQo5@;xLj#dGoUjA?nMoE;?k(Xm(tgRoSOl}*m(QCAx zcoLd2v_JVqRLY%osHC}nm=}#r-ENQOuz+GyB$m9u)Mm&!@hyrgDb$@_A4WbTvX*TE z<6d{;eqAZ(6y1*EJLpAs8(>l{TNzf@@L2m!IsLc$ngd?hHb_x*hxYgnGHaCQAyP7y zoCobk4=J>>88nZ6cL`EfTy3VcA4Te$q}`+44M!KB&n;}sC-VaG@`>5pJ6iGxwbN&| zOV4fYyO57wIF6naZS1P9_G`M{9D;V7oo~arZaD$}&^U-|F-5AW&MW$Uz|60X>4-f=ziIIg9-_5Dwwts<%6Lfk07?g)wP#KA%ochdFN6%Gpbo2#oNw6Wno(87i; z!lRMAtPNfOs2ia+#ONQ{iQZ_vWqJ!{;&)Z28=(-${(!#otq$}SltH1b%71i92o@(M zO8r-wJ_7{<_%R`3Q*C@q5r|g4(*y&d-sN)H105q+g=pBL|B60?lx<|5f*nCJhFY*) zA6jS_r<`r9xI}Eq84-P|nFR5_avFwA27EEL=>KBPYsaCh>D^uB2=cR2cZE>GFg zmLbjo8L1|rf`DjoMpZjST#}eO^}j+w^4XQW_9IO2x39y6b}-y-{f>wmc3iM~>Dgk2 zktbT*M1Gpe40k(b>{Z023qjgn3O9s>br29Qm)JoniDcp)Sz6hPm>bZ zlUyu#CZLp*J5a~JgECl715or~zD&#d*J|^h!5_PZg-TE-VNET-wP`-~W=keB%I^Pn z@OYdL|FSBX%;fRdEL?D(s7Wgz@Hq43JN$%n2nB{*$FvaPtFPEB$>HGkFf27cB^#nB zC6+kMlj{`?4DqJ~)F8QSIdwR3q#&hjxnwwT=imadWICiB0we&1)-Hs|{@*!66a>x- zpDZPws!z!%6;<=24--X5zVyoyKCAf^32p%odqj)d_H%9M}lkHYLN4qOoyBo)WHljY;gJ%)DXwo+e zxP6+?xu4DIYJ&xx`l$NywZHsrZT~C(@>Y9aeB9qD|1wzlJQo`vi>r|=&;QdbZZBy1l>VTa#2 zesGDWOJV=rjx{thP*W?E-f^R4?i_Tg6?Cc$T6=m;xI}_c=$gY-q@RWFpCl$Jj@1yB zlYJk463{X#bRZF1h*Uo@InTn)cf8=_|JP50P`|*?mZbPR4RLZj<9?KHGUY*;8(2-1 zram`?7bUE3)DU{5^UmqDR3F2`CCO({@a4}z!i_dg?cSR%O8zbvfTZEyOQ74kP*?d~ z4i1%RA&@HihCFG&p(k_UW{1teK<@SOp*6AOlD{cYs>#hT2vLLix;>GQq%rY8qLv9a z+7C4|s295Me%o0NN7w~>VD4J?47hHOC!1JLREV;q@G24Z17Zg9FH3nOZa#5u#F+9*Dt@&t9j=i-V`np zto&~y`zLePU%ow8x?p9pU>`IGz;{ZUclrQ9i@Kc&ESXHSoWeKIfqY8PBEVU#xi@qU z;{BqvnN_$az2ioud3up5$)tz6-auviKo?*A%bcd!U+n{_7{TjjS9K~FvORiPYAfX$ z)c}EK?4OVQk&2tF|5Q#Bl1?q6n{jYz{J;Gdq?n^8AQ zDD9tpX-ksfXI47?iV>1jd?P-kCG=7fl^}5IYc>N#3!zz^;pM=+`9(tQ zZ9-4OW!IRKaQ$%iDw+RwNjF7HnKz+z7t%R%w^v@(dAy3C$|6dokH?w=1Luz%Q%tEp zc?J$j?;pUV)U?Dpl=w^^)<}fjhASj{6J`KS{);G(MHDJWMiO4Wea26`d{h9f6l5`6 zUX#sQz685ddgm}baCQOh{|(L3$coYe=v)pg^uHQE6*IoLyg0oie+ z6+{sCagha>KVrRu(qRP%&MzIQe?*RmaT3eX!}^g}Qg-@_enm&~25`t|XX5Rg@PC^J zoP$izIoqE|5;LA5yLi1kPXTeSdt$?bx<_ew)*aj_L6)-#O3z91qMXOF^l!hvQ+&Il zNeQY-xwA+JA|v@zy%QtdHuvMrSM42SeeIx612{|Yx-;s)J3Wu{3b7qF^)b2pHuL3G zQ`sJQA!HkdXc2ABTq3cW3C>SXwl*ybw#)<-N1CIcgwuZATpiL54-j|C1b~`ai1xo& z{W-?Ah0=H@k9)3FibzZ;{2N0!ZI<~ib~29Ma{eWn9hy^L-NpWwm3?B9ed5u_*b1{h zI+=^clMjTh`2BIQD$^_v)&-@w&f2yi4p~3Y>8O5}valQnSzey`{T4xfrvxbZ-1=&uK| z)!3lpwooa{d1y}IEl{k1EId`9I1Oc>8Y)0E42%uFnqW1YOprz5Uy3wV4)4OBAex^^ z!4VPOx?DVzFSA&2o8twlPWGh_*mpphtF3Itsxv(8bYUllqmhW)wLJm^jdZu7hRg)|xOwdp%o032 z`O*k=b!sM#Zh$<&YTB?o=Jd^G4dh<@wB_WHu2e(N=H?XiX3yVmunOZY)@C!ziI)xpIE z2l@A{VHXYC$e>y;2K&0*l?@$5tTuDdK9+v{qkVOK2JmN>Xm^Y{jGy_a_M>m)bo)d7 zhrjO5$qsq69#&rmvkTSJFv|I!s9Ql;=l6VUNfbT4&Iwbi4kr5yd?-C2C0-;dLl;qc z9D+feJVFKeuwP^bor2HU>q&I+ZQjGfX;i-RNdob+DVR{jfu9>1KbkDJ&q=8q`YPxQ zRsTI5eF6r({GH#oHe0E%0?WpCaZ^)O0*aXKr(Er#+Br|?{?7D0u1lLij-vyJeq5@##n2L~J1E7qS|q>fkGnuCPbjK8_lAKq~70r4B}8J#X?_p0zY9eH{#sU{9;?#WW6uTHw-ifXrZCNe5%DgVVa&M2Ge4tf2Dz z5c7UiBFJs<$$LF7yZ%z;GCtwx$b@e#fhIMG*_^Rt`;p_@qWzau*(6^fR?>}hp{2I_ zBrdSC&vmy>NIiwp+5`PrTKM`9?0?gM_;v4Bk@utH$^t4|_}Y+-XA;yv9D?WQc!J-U zuFZnTR(79;ykfH0MaID%SR^a&QSzlK%ZsYLF2R}(AksB3wj|Y#Yeo)nJ`rFD7ZYnl z95T=W9Spq?mQL5hP_-UL9 z7^7%JBV_D6-?N)izl)?7o9YA9Hy}@(5d9|H`TBgW{50q3FIgeI>Jya!^mUb4f&VxU zF40w%bw3=@h&?j?2D>g|xwN2I#?S06Jv-<^^qeq8Bmjo9+?8G5H;a%wl-e@%0(m;F&bMa{oe7R zy=iXo^=W2X+Y@7P`Wl85cIU#ZIGqGH#VofCxi--;)vwtl`iFYQh&*`$zgETX#;NWv zxnF6{z$JH0159`x6DAP?x5kF56(MlsFK zrwOs{YM(^9szm`SIkj*NnYRw4l%;}_L9J=jMs_*nUiVGU&jP0E5(;ucdtVmDm`GNT znSXXT)rw593AgHWuUHT%t!QN5{|fx|nDw|3`gX8rbF(#h1O!Afn$>o1k>v|vlVpM! z*DHj3QQRK6r+Wil9*)a`pC0xIoI%(2yQ#Ci0sc2D#lZl!ulFf0^qBv>T><3BXLBmB zG_D7WPB7^{2XkVux0j=3IS4Y_!_{kVAC87u*56{$I7o=PX!6}ji26KipSn$~3{Gdk z0xeH_q2R%h$QM!SJ)j%_c+o+FfO4Ly8JXAf|F zk8%KHu8Lsm5lhX1*F$IXci}N8VfP=3p58<_;Pg5WX(FUmXItNc#DmK z^s*56Mw)r<_e7^K&Aj-`nN9_zs(reI<%2&=`_5o_Vo`>&#H)xsv&tc-$UHeHL;4bN zC_|4X2hV_{o`$02oWBd>w{Rz7Ns0)11%P+{I|YgE0w^DA7Z3FNl`YBUtw-zu{IRo$ zqa*-~>F~VMCAKeP{EoV~gU@dNGi5P-p_LyW_NlcD1;_mOALUxTC?B}U=C*^6q;kEf zdG}eNpGjyn72i-#FgiBGTF1(Us;jboO^!deUe#ToQQR!_qcUv^F}`x>WcnZfGzMCF z{Nz?fDraR1PsdXQL=+IE<9ep?g>^uhJ1TW)W!&s$sTc+u*vCjFf67fhuo-rz`3RK; z{hQ&>c0U+^TB~3Cjcn{z^9*H7T!hOsU6=(h)r%@?ACPvjFWtaTH+fn9KE6C$?oE0J z#>|!bdf{nS{=14HN{ST^+8kr^K=8O4k48|fD~k7l#+ATe$&wY@trs9yn-xL<3ri5$ zi|H`34}#^#+QwYQi~ZGKKi&R5yX?kix^<(CebKuQl}dLWpC)a|-N$bH>F@o8k56uo z==V0zT${@`V@J{=a$~1+Zt_mrFjquTR%-GmIC89Zxn|$r%{p%9k~F3AfFpKYEN2T- zJspe7=nm#~`frM8FAiD>C%HEAh$yj|shG@z4uiDND9Rfae5t6g$PZOdj zJ++^y(fUwnX`iBgGwE`50i-`=x8o%rkPL}kRjvoKT1_&46EVLZO_KDlXqt*&c7KFz zW7?H<4`hy>W>pks#@>+r5lg4to|jaMqDU(d5bZ(!^F6Z)&tDv!nzH>%g5f==#*QK7 zbwyNl)O-f%4Of}iwAzMZs`t$gC&e|9134pL!3UKSap zf7Vr>TFVxb&%lv{0j|#{f^H?9_tr``H{rtX?;~InL-qgS^ryD+QQ^?XXBs!Irnn;+ zE+|H+Zf;6_!Z19ci(tGIG7rQ_e=aemmUW6It(sTdw{vl+#*&i?zPXpdmGjQ8ISYCi z58}u*2_R?_qmD`SX%j=hiM~0+{V7JRVSv*lRy4i2qfea}2K@W2gMXb42tWq(3=aQ3 z8RF;=zUymmhvWEnBKPlGACe@wU)Xif-~V_FS5TmJqJXE7B>hu2N+(ETW>SPZc~W&d z)_|C^4!Au``r90f@0{QEuU&d%XM>R41KKtdWul7%SYarbUJNTxR8295QUsd`d)5N) zg<79R$+v)YU@R~9j$9Ws0qcL1cYC*SG1m$wNUI)6=KhCiA=H*OGK)?`XBbgjh6g3B zjO3a@o~MW}-Oc3_Hn^+;V*P!kc>4XyAn+@k2poA0d?E&yUAm*G>HCX9XFPwj5RQZS z#VD56oSNvH3HdVpwA1$|$*AeZA<~*d4)k5NWCjYJ8@{kUNcj^Z{^550^3iNGEp-8% zNJlw#<_i&e)PF@N(X*VGr$&!Yoc>2CF=o{D7ovZqoLasoubEP=jd~*v@t3by9HOVX zP{Hz+IhhWEMI4gn$0)JDKWx&;e@?W1M~THD{rXp=@Z~=8a24xctI5EdYf{Pp|7r&% zOv);c?YgBUr3`|(WkCux?B8ESZ(VVyo*&!9U-(83N@4caf?%s}(NFDx1m`|cFe5%_!ICa<||G;dQukTsZe z3cMq5jRcm(@f!jobAlsN_=%mK-Cy&mBo*VtauD`s{ARB{e&N&P4#CSzxA*%_n(-9M z71(6Sc{<}?gFnRxYwbA@g3Mku)OGAjzBWva>F5rNGfTW8O$5a&T-6j+^rP^!r;vM8Oq3mpfAIr1IgVWk2>D5%|;&SJO7QK+j zKn>}Zh8HI|AET46Axg-+Cp{<2x)+h73!%Vt`{vAWj8H+)?UiYGW0MnMQy?^EXoIl!!vcWg0e~d8RS&|K*BrM3#6+8GkpZfSauIU9KL&T(QrLTesOE;~2 zC!#OQ0OO9_v)bd+K!$>Qva2Jzz;hC8@lSYl@)hUT#RHkdP0;<`}e7p zBk&$POewrMGk^SfU|abn-0w<8ms+9>y*+jp0_qR_-v#Zybhf5-7bD1M5H+HYh4wG6 zMx3^2Jbg6$9)GT`FQf*Gsz?yRLOhnO;&s@HT)k+g9+uVLy>ix^;phFlFOpq>x=k<_pa6ce5A;-{nR6yEP=yR zTXgc@+K_5`sI)j2FO5MIFcd$#n6dlB!}WPRb{33|{{4WdybZruV$qu5!J9 z0i=L)C)V}JrH=kyumNnGm)$cjUJr^{`eQ;#yylH=X;oiE9fNcDv%QTO4CsLf7nmyfr=KRcC^z ztHq?OPxk)K3wZ%#Z5v8qjoR#yi4Y&hwGqnZB7N#w(i>4^{(N$PYguHdM?QT~1{szz zPMAXJOSg%~*U^z!bb5++xnaa?GWH)^ZVeK0T+(4$XXJISIcsi9uMXHJ74~(BJg;dY zO{WKS9GtdMXrnW$wi&lzCod{v{}Z1cGv7cuFEgIF?`+bEikh;9?>U^C0d@GpS5bbD z$y;d016{=F0waNdzQI6JLrYAd{oG{F*4s(=Qhw`^HKQ(?mqUCEZ5sQ!v$*Q$s?iRX z$TN08*-eO;FIsFvc~rpH?=7(R+paWf0)_)@J@KsbAt9%RJuC|9=%{=1@6gQ1(=kzD z;p$$sx{sx#yansliMHtFfQt`v9WMM*7v0WK_7yMhn=bst(l;_*Ko+}-B6!>n=o%fh zL@{u)fp)jwVWsr*FJj%luh`trrwsYJ`n}hUnhkd2j=y|d`&IeL51hvTF|#zP&p7+b zT-APe6CSS`lgp=O=ANsQm;RH*$aDB$#HY1){^b*V5Y;KC1n~=IA)tf0^>(%Zal~^O z%ayG5t~1EQ z>n0x)ls`_k1ED~Z?twW#6#uWn69r!C@xkgC_!wzQg5i+vV_rnK`*|hUKJG<_<^f>4 zZ;jm`>_D6ndb*smok}BWo8H=Zl1IA+clZlh0I(S^9sY=jMDU4fP{jYwauufv#a2$g zo&XaE_gn5u9Nh9KZLi8-OI~V&to)B&gUuV9o+^STYnt(3YgV+pbXlincEQwQJKr=bc8{OHAq87OK9FV$Xu^ZbT? zlKA7DWK^LWZsuU&dQ@PNr=pNC#!Apd)igA4Dhf`hhbDe^b$1Qk{Y-)%(RBCw$#+qe zCDWFx)}eI8+MdRa=Xe&nQU#`J6uf6Cos4k{#*;rJ2G`cV_5>>AQ6OyhptUE0V$Ryy zveY7*zFTiN&dnnG7CY&Nj=;$q32GjGKvQE~K!JN9gry(N`5U<y_L6b<_RM zuPmrF2Gv!DtHSg;mG8}%H1hB(BGI!VYTKdC`TlZ=+f(eCkR1^T;^(Q+H`K8oUMzY) zXxT#*vh!oI{*^{#@=MZMw(|^YEp7#3X$Vhfo0x6UEa%(O$;I{f0mgn4iiN7s*2}l8 zb?uYZ^RC2MoM_sr1{s~^$Aw*=MV$I< z|D&o`VeldRByZ4dC$6B!2{_G`&n%bDuQVqN!hQDHr7z4(ah0lDg_ zdZmATY@^KOhO1JR!eGuYAb;D{(+tCqOHv&kv$lzyD&Ad-zr=A-uR6|`^;Z(!!Y>8- z7ms$VrF3l#sZV85Rucm~HGuWj#cby7sngLp-~Ia$X7U4m!32{5-tU|eA-?^M4mtSY zjjEMc1?PX)?q{w4>F)PFR|zjBA&{k*`(gu#EHvu$b`j8-Ymm>RwAo@Zi6ey2{mMc7 zHLue8qsno&kT&K0d3ONKMn>&mpxfSO~N>A22(u;$Fr~1^8> zyO$DfplQ`3e0z7}pA-jkejWx1H(ApC z%b8qnMmy(~{ndUzLm!?e=!5!mEoIoqn~vjma7^YJC?&qrmgaL_)KflC=x+l7VS&9l&`K5@?%tRfcZ@hV& zEne)ttv|o>zeV)?2zv8*8BAGUEbc#Hu>n4Z%Vm5F&`cPJ<=Am;CJOzWPb-ER*PS5B zRP|?k0o@i`;Ns8k@^5c9=SjO4yJ83J*i@#lRWrFfK zib|Wou8J^aok^Eg5(JtWhq6%3*GWh8riNTRZ~Mh84qJRJf#7_n7oBTyNiy=q-50Qv z7>~%a$_x1Tc@P8`X{6}+T6aE$7T4+0L1zKcCk(~!-`l|`BDx8C+@g8kvi-30`t>F) zCi%B74!Y}^iAY^J6YBHoLdI_*cE}9ocax}Rir4A8>1r2FFh$op9dy*JtgM>Jrw38U zE}|$*vWMUslv6OGAIPPOiy%IH^5)efwm7AtkZ64c`P#SzoLpuV@ zA&c|)*p{JaX{C*pckw#fmT?IjkN1qReWGUE_?6Rm7t7US!PeDsRO)_eF$uA1+>EV1 zf4}U@%@^Asnwbw3;VvkXWj>EWM7RAB?AQ^vCnou>#!IuzWvX5dMTlqeq>0eyhK*On zT(b->sXtjtphBa_gKt$nx4nAnyxs}0d7>kkJO1CJ_*#lXQQt%~SLDg4$uJ^{c#4TY zmT+|`R!ZEDR>m0e$O_V9>>CQaequHyX>rrlmZpaui%qG9QO+#cLivre`tI}5CaRFO zmMozId-py=|yr{cZZGqhBiiz<`v(mYc1U{7s=4FnLs!{zNJ&9A=yB z>U1k`ev~~qdplGbG>nN!l|@IIdYofMM2_-7b{Hlto0hccIA^pjSv872D6M-h@iO_l z5(`IeV@sD3w?o^|aSpi}n{Dd!{%HYbK)_*rg0?ZzfppSt zsydm8ipQEyRv+NEDXIR~cU`2%;-v^nqGq?gIlqm7=!0lZitTSjrvU+@k+_lqC(qz8 zHPV8e9Q?Ir+Gt(j2#?i0i~ARobJ;m%$1J@NDLXG$z}f?cNKue5!J5D9cKc=*IP$L^|0&Tba$6@NQZQngo1Q8NJ|I;3c?nYl9KN3Zs{&*q`SMjhMD<|exGyB zbI!Bg_n&(&X0Mqwz}kD?@wu+sxd3t{0`^isj?vWrvg?k6jf;&PpPEZqV62$(kVajT z1DV=DTTaNMA{n_zlZ;BiK*W)&J6&47NQ+-i^j6>*{rH9(PGHLSWyY*8;)~2$!8_vT zD-DBJBJ9oFPC4=~G6|WKYsY^PmF8ooTtVefUdQ23rCp>!5~FxCiGkL~_NwL^3m=(v z8OUuvwbIpS@CmE!0es3raz~rS{i$swPgtGqO3EAjo(Ja~p4&Jj%xcITBCpC_on4UI zE{)3kQtbn2YEydfy7>Imo7E4d++w(yOIAxBsKx~1s5w*|AzC8rOG79YH4m8|o-((7 zNlD&IJw-oc=5VlvLxG-qsc`7uuoVoQ>ey@JlJau7Z#mlCN9JEje-9jXgG0e5mUn@t zUA1o@5B!VnOekE}US56#Fh{@B)v@`t&Ykwt)h>7icuOMM{|KUpL|K?6=y$nr4Dh@J zcnt9MeCYdH63MDE3J8{ru$Bmds1suryq)pX=8x(xWSAkTRy6V0GCMVG=WPC;~VExV_CBvWV(cl@M zhZS0Okqg2UtVlsS$TQlyaQk)ZZX1X*y)xx)ZH_nU4dF)-&Hak@ah?#|dNxE$M%Fs{ zAYz5cD~Jc0Q-?$eaV$X3Gq>)gT50LW#w{RfN|sNVa92PhjwwmsAV?8qtVe|(sAaQL6wVeP1`=&Yy%yq*Is&ke_!oki0pkJ37_Bu7XLQU8)^qm!nOyzbk;SSF3_x5`}P^mW6U!Xts( zc--%EMuNX#5Rp%2s(TA6O1WMa&KxaV+<1G+w$Qp63)9OJ@p7PVn2QgoC$s2nq&j?# zduz-j{`OM%4g7G*4x2TLtw(#6`@pA~4Gy*G4x$q%puR2tDi>MAc-F4?Rk1EJJTsbR z+jy_rw|q8QSFHDLZo!s=$@wjn&J1y{E+b~eKX(J$$Y z?~GJV%G)>!x3#{{6%McW$DWdvdcTWGQ)UShUJbJs?bbl>RCWBWYLW-&$2AsJ-8sH* z6i|n~1(u&Hhu2M;M2BE9S(FK;Sn+lU96kB=llu_YfhnOMk{{ zEmswxzUqDPk2?Ap81uJo`*DjToFLDAwlcC@6rn`9!n73@j-^SsA+y_W>+Fst2Ju@rv68|Es=yo1`9u zZv7{e6EfGyspa!y>WixXK_C$W`PA*g{AI1)OOzMZH4aK=V-XGg35G1{`*7DOgeci= z0$&69^zCTPv#Tk2PH}LhrhZMlA)6z>Gp5nu(%HDPi#wO?O`JmVPcxeg%Q48lK9ktouE$!Poa?%5T{da}=>BGNfTq9O z-UKysLVFa-JJO3vL@56b-To*OhqEPR9Y{z9dC_@4UcobDI=m&dRf3)hphJ!o9xerv zJiA=&XU_d#w!O?l7B5PIAiwB@%P2GIeu}=6=>dP$k$a)x@&avQT;KN2+zjx7m7TZP z{jfeNxZcAetF;&N=^)S_=Veg0oST-l^qdW*me+A#!`M@h1n9WuHcq0&P~UX*Stjfs zU;b+lTNq=yVJQtqS=|7LLl&7f$9wKcx643hrnP_U({VCZ`7uKm=*@z@EbI%|R7Idd z9M&Trh&G}bE{ATHt+}@w${8KaaQ145y+JNe@s%#S)5<~)9lBR}fzuMBZFDbmOIj%* zXlQZs9`-~HJ}F+gxOjRxT7J~Gc;fVCHZr>1=8O5Y@KIWRW$Os=OZc&lhhuIt9L0p? zJ`f2DJN*PCX5}~hbX`9-5pB<7DnfLm104);T&U;8?m9o2t1YjAFPi{p1&A$$>UWV2 zevjCd_^rn`$3)yclll?WRWrsl_t;_XQUjdVhf|X1h#2m&E&7U}919Uf48~hnE~VZ- zqLnc!PQ&UW420=8yfP+x+JYoX)4A$rufivz#fQ3R!>5Mrc;zm#YmN09!%C|(ROsTg z6We5SHSLy3vXYMy)~;lH5q9|c)QcU@P~2UGcvhj3FFH3*&e|Hcf+Z8Z>90^)u-;rq zR`fHx&mTbuqSR|0FIN*)gY9=rHKm53E((S?N4U7HfUwXNtO1tuvFk9XRy5Nn)3d!P zERU9?!=v3`$VGy!>|I7kC!$PaWSWgXDs^fLQ-XHB~&juK=>zQoTeCh zr2_Szff|4_|AaL)uoT8fT#5<;wmUfLiy_eqjo_H7%j>tZNN90H@}(c(QMmi1z0SBnO>hY_#IkyKmHvm!vSGX4r2UJDN^=0UIP6a zB8nlIl+!QFl>{WY5;PXOkXLH1f$0HL&irQ|taPZ#YBq^KXyfVC7Nj6uF~S3Z$WMxFoM{8612iL)O@Xtq4AqQUzr8(5g7M{)r)VWF@@lA zT7Q`cw_(G53eoDb5rj)~5rRRef67*GYp-MftMdVe_3f<0C$RT0YZrK!k43=niM%B! zDE~)g8O=`VYGcCFF1wHYsOd61^hWG?Yw9xiaS2wv{L=^CSjhu#&Y*8!`=xisDOVg? zl#LPfQz3N#^`x0P*moacf(wlhp0Bfs{u%DerLZ7lN;KSl3jR^yz-W(gw1r$4&w z$PLQzMc!&;z|Yo|&;pd(uJFScCZ~EL$zaH7PZcxG(w(Vb zzuoY!?!}VZ`~TriozMS&xYLv>=W*8i?2u<^n;YEKJxI*4h6PE(_u^{wpM~*vmBwNx zy{HVeW3EGRE%HCLc1Mgy7sXKH0~~qUcY$$(kAz9e^Z?nJzpufP>?Y8mHd+ZAF2S(V z=cvYYI8zUo|Bamv;zxAhRV{-3@mac7e#qb4;(79RSw@X}9NX;%ZHNBA6gR8U#)~J> zSE5h1FztQJ)^CL|tLdsHO7zhd_@ygo!txA_n97VVs5W`7WPvq?sLviJ5w3dj_ zd-zaF!w4y`AJg4H4Qvc;vG?W_Jc3@=@|5}?)Mb(X* zOm_CX-034ze1_PkKJ2~sz2r6@XIL-qm_30MwzAcdG^O_}W)yEO8SC>91r_N5Yo`iz z*qTWE)<+n2ns<*QGKL#}z;up3BtRsLmGxC8;Ts#R?H)KrqDg7J#*DaNh zbHkfO3^-W}j}!I*x`=-S7i@~xG>jVN|CVT|N!^b}YM2PMX&6+wr2T`)A}<=Om;Y$>+kYOe(e0tu4q*A}&qwzBZxEob zX}O!4?=-(-`Q0_2EaOiCSUKK7zo!#p?dP|f#%*Sh-|zhkC?)&q$G6Y&AK|Cub**B@ zX$g8^F#GJv8BJh!*3&kwt2)?7Pmmx7n9lxo z%y*tV7zoJWL8;RQ6e5hUFcwqPC*}n<5sT`(vJexp3l+2ARh$@A>-5N}`K3Qj{1-`z z#ms*QmQOlI>LaJ9BmSKQqeyuuuh~@`xeq{?jTjdFeT@4FJ_71f=t7+Qcf{AV_OD+z z(=7C`5~1oOvE*P+)g_%t~y?Is=>Lu&C1SRhp#DsVRLf63IY?Dziy-zRAq-RQQjK}y?6}C zwo!2L{-QxeELzt08&^A)7GBGH5i#V@{)al}4L2IyA-!zdC&u^erOdBgCkUn8Ea4=| zJ_BahgXEfctI(4KiHF4uFk8dJgb?)^ZBi`;M=Z{P0dro0dV99MqKc@V1A46habTjoxVmb3aCo|anWDNd{|-)*9GCk=R(c;Xt4oAFlhp^Cz2l3~l|uHGHGC!2^K5Sr+X)g^aqHlQ zL*3fV=<=+-vlV@VWP%ZtwS&(_O^U1Rv#pxcstE=AlPi0J$k|g(+S2EZk=CawFpy^6 zsj!mU@zMvmFQxF_y;v|}EQ74!tZig%6>d+)V&^5~;WaejY>oQJR%Gx*1Fw&whjeZF zTn7i&ki0yMoN@wAA?T*}Bpc1*wleC9TTrp;tIv#JG}fuO!7%r-2gHvZ3Org6JGjcxlaaF#`Ec;_jx1y-Vr=dCD~35cz-=jA zavNaHkad0ARp5!i!V(fJ!dEFU7EeJ-SbK!=B#bkSqW)+F>J+MkU7jvc#Ja#8eNx-~ z%4zN1?ePh0N-y*w``oXOu))sz9z#o#Fy(wFIlNm>$IMRUzC`iC6eqn5C_vP!_A~21 zl@Xq2*KYqZK4;vy_a9Sp5;1-X5-?fLeC8B;f$wmO4r5JD|43- zQkdDHwU@y8F!Z^n$?4hAk?4zhsJ{kSbYcpR?0G7$Nj}?|srmjw^zWR284sSc>B@%8 z^hJP0k{*0HuC}_0S*}YqC7PRG1nQd z-`Yuuc|eDMnZ|kdrP9<<=-(E;JgF^_Dt&Bl1xv+hyWrTyBJD%B4xtF#L6Or?>uB2> zDD50HcOM`=gu=>+V#sp(&#d>@zh`gwl}dx|dOGpsiv@laQ9LpPuU9#LbVBu*ck^J^ zB%hg3k#N#=CIgbFqKk^CBsoxn2lLF$W|`5Zh!4>eG1gu9x?er{-M{K}KS zlC>&9^gZNNl4fd1jaTOestV&aE-P@>u<}4WeuB3D^K&{Ps*}r?Js!GAo(i*39V=DZ ztc+T}@dpR&lUluoKhLbPjH{q8th6B>x1WbVCA3>Z^2-|v?tvbF6>zbLnEy##fWf4{5Z?3P5h`w+&kLxLm0eI0IM$o4nS>PX;rhTC@6PSNrFK3=-przL(R0rM-c3?+Du z1Yw&Np(QL<*jm!=JeBZkC~o81Q5o5>?eF?@UOBp)$5&2>$;YKnX^$J)wVaPp?|%=6 zC*wT8&xcsA+7q{=tuDOj#5S}lNSxB37HgcxG?UUBLPikhUQc}NsO>oPPc;I-$`O)( z$oqIB;NyBL?Q{0O(%@ z3jhIgPX`mfb>`c0Yff>GAXR??|6ARGtPB8NuH@o zkt0y`j|EWTZHO8vX{;Dm+!@q7#Z2`WA^X+%{wP+8xb+_y#gp(ATX`Q29&E@0z;7uN zgTbMj{Osm1{e)>-7UCR3{yTEDB7xj+M9seO;;dn47g_39RMY9sO+j_MH2DO=dve z^mnHUI-Ll`yyj4Mjk>1GKdmc3AZiSzz1X)HJ@z3Cj8E?#x;$0WQhI>=kzQDJOX^iR zkUiee3N#NrXpV|n_*;vyrtx$1!vMoLY?@Y*F)KYYF6}-W>F6QVj_TKJYm3%*$6>Rp}p&C`DnMz@U_+`#no6|plQJsg( z=IW|4J#-EB;zJYY;lb<#G&ROOoY5&l&K^?gMaF!DX%S3*Dt6Bh8+C$7Eag_jt^K)v zR!L=+6vLv86Pdfst=;A%MpT5fqBfQgJwmxrm%yf+*20ZRXEA-OHu>ptNOJIx$OF9D zBq8Zo=^G7XEe!knKO`^fP=<^+POL$EeXH92 zFA^U^?hb}v7Y3{@cwu6Y^T8VO<+@NxZ;ZQQ$z6+DqF6a)$F96o)bD= zSExSLbRCVGpT(TVN9XSfCBFN{f|K@G!TP<1t6djcjNEl^5rwJAzn97a$xf_-74XL+ z9ZM#yXYp^3QKw)sYqc|Y4G?oCL&LLgZErRO?esXk|lU;OaIHj4S;;A1l2RY%G8G@-T(&w9gOOsOX#ZnEm-zj zMt1Xx(H>5Kv_Q2G*2EvZa`ml?;{}ybHB^j@k_^eWtr|?4gNUfdWm2I4h+C(xy*|`I z%c7t`PRNLeYW|J9quR5Omx|h?h5ABWaUuD;XK``i$^*&75QTiW^y~w+=HA_=AN6P5 z<_--!HQ5N)^60GxMl$qozFl*O|_Fq)aqIjJ9bdy-r68B z>4y|_tdFWMED*xq)_*(15wnR{n|=3WdU=R%n}21L)8Y3=hB0HIV8K@_L^koxHe!v$ z>B*A>)6O>khEjE(9CQC*TQv*2CDG8M_e(`y5HA8JVff*oyx0-62I2zu*nv2KU?WH! zTmYbN2HD8SY26+2y_ZP-_8v3drnM&A$S&$gp&M)vp*70^4i~lyI1NxvAqVU!Awgnhp6=4Sy5zG7_%nc847N;zv(Qfy(IzErQ z2%Avw?CJe+rd5NRQPlCM;#e;s2qNKQ-2-B@%nVl*8P|0`vbr5E3|uoKbyg)lZ5?+R zCE11bl$T(gD`-{Qk4&Jgg@5p6fjR1s1YVRFRDIuicCX|y*Td=bx_d*Dr`qF=w_%?3m z$MF&Cl3D8*w*&_@+R=;KO75#vsV5P^+YRt!rj^y$B+@2rOYqkhVDS#&WTVWB&1;D5 zvC!IHBK7W1>YX*fKj(gS2>mO|3oEy{QtsT`=Jalpp=0V-ch_+8R?=g4i zpej%sxFD0xGE8r(yn3aE^-b878tVfvNqKT{w!Lx4?yd4;-bkbSD>0?o_?AYJl-qt> z{ahFps{WcE@UvFd++pF_vtXsg)VHr2un$60<8Ybj6McCs7D)NJ!=lzZG7-3aR)O4e z2&vCuC@3fu|E!~0Oi=eD2%~L7+;>krqlivDMcD&dO;)`{&$=$ITtnKg0Z`64? z^+!~PDGj~X#-qDqpRu-*l?*3$f4$18EM=cvn_viJk<|PcU3s8#aflI8a+pAZ;9GW{ zH!$QMthLp|S8W45^MDEG3?B3I8f$J^u1_dP@6w(b zAyj6GSMsphbRZt)r1u(IQWI&D0Xgw&p{VAvB|n>aW8XeSWZV%;YpwElETUS$&#PX8 z$39a-c8(61Ixuc5_5>LeW@~!W{^7E5ju^NWw(S@P?p|^#VkCS_pO2=;qh>`7!kzw* z*SMOnmh$`^2nLswEt(3hdXEfq;PwT%5Pe_bD@Vm4;uiL^5B(v-Uif$lNI@5m5&&Yg z_)*fPa@(=5QW&MFA7_S>Ar-ITF5||KsuZ0SMiQk%SsMmEB^{_ zWqC&DXl@$2olY7yf`jbM;n}PeEyfzFm(kmo1F*kRnbLm7riTxucbU@mC=shML?8dN zsg`lsuph3##K3p?W%Vu^9KSNOUSQxAwZIvHVytwd7Dg$FTc{95J<~;f#pvIBY(&7%TVz*b$ z=|L_~s((a~Uahl#TN#0wmf%*P?iLQ`9854N@8KViF_DE@#=4xc_RL7S8?dQ$M6+## z^kc0b(iixcy!0Hk0mL@ zge#v=@H+=wt;b~iRQSD=2rVCgX`xec*TwHM4Q8sc{8tYG0g_jS%U&K<@~V!|jiI(Q zD_3WfJsa24gdlex8Grbu;lyWR*Y6hjoav1{gB`l?R~kdx65CO*_2zFoG6VcV{M1>M z5%%NDE}%5BP%zO4k{(Vu4;u00#~NMcuy4dG!D+nwD-&g@dt@c4+0Eo7Ejt=3iP#d+ z5k|E66byzbfPXW48n1+dD10<+xWSMsH>Dv}K=$MyRwvU*Q0f;-p4e~pqf{>ermvoQ z!Wxn@)7gwjh(McLWLGnJS!!3a8hTkvj}QJ6Wr(fnYc-jkw-cu|h2N?5VmrSmf5bjW zN{GZyq6i2QDY32!dxZisei=$Jq!8dB``Pl8Jei9v2k04IrKF5>yJO9dep$hqU%Bi& zg~4p)jzeNPFzF(U3h8QLr(*x@SdyUq2ltI_&phbY`8E~; zvuPgf76t!)CtJIGwuGCBwQsT!^3Xd`X_UJMs-IK3^q)e2#A|6n-Gu)M&h>XL>K3 z>~9uTEt8x?_5~&3OKrkAA4^N9ARrgL_K$Q+%alsU#@;&??D`I)7I>CaySn!CuYktG zs(9B03w9sD6KL}MQ@oN$sX}(j7loxNlvsItO6R2K3EN@y;>ARI3+R&=`sOi+F#{GzxJx*Vao~y2}TM^!mJFAYqT6cgsf>#>AYJ4TD(8F za&ED5ZsikJmr1@KuUE;c!=jNP9{~gi?K!pH^w;DWI*s10-C88e+b2Iqnx_m^cDWbq zIlU7;C?C41r>Z@1=Q)4qG(XlnZ&coRHMjk581>G`j}QA7g*7B9+A4Yn84bN!c()ue z7M#{+QUkb-?+JBdG!pncF)UsRrA_t+MrrB0nsP6hNilIZQyT!IJ&pOfKch#G25@PX zg?YEfg+Wn1EyG3`((-;A6@?TQmCi(dCe9({2){)W8sfLW3x}UuoT2XrwBFcl23BfVr_8DfAcOri)Ir-McMQEITEr8q;ViS zzf!l#HNn9x`i8}-ySwT{Dcp> zRWGv*$Qz<&JFD?ayb7DUX(%qh9-eZZN6a|!>bbOACDI*#*Bi7`EW`n+Kf?~QhvY^y zaovb)cKhfXC&^>6oW$P<-KPWh3A(sW)Yif;R6*Yy(-IaTPodV_MQ-Vjoo-s+v~2Bz3^1r)V)9thq}5~^N?;0Wy*O0(eco0c$W6l zn+`|hLzA$j`I;8pyw!S)z6#>s6@7Vo6xEI|A5BWt(`rzyOJ9GT7w*dUpu4mHs$0aj>v|j9{O1G2S7{8z4C8?+dGK7pnLs$Q3Wo2=0$B65?{sS&KMA zNAxLy-5xw}4b|Z1SBjFPt3YdcF`aa4HdD^ai0nu1Ta(InlV^sZ-gBF?4^qxupUgWR zB=voSGNx6B0vbas4v3Bu#;>*yTXjBs!XL6#OPm8f@t8DTttO|*3$f}Y3UvsyfTrRK z#~fiC^NhzCCtrl=X``*ly926E0eNWhWkL~Kd@q4C#5a(E`6o%y1UO{_TpEf=&ev+- zDQF)gy&Ul90}>LU5-8BYVR|nl=pZ^@55V`t^8Xcpzh`WDE;64{OOWg5p3n1QM<{rj z%6|1(FYfu^c|6`Xzx6$}5NG(Hm_ALE$Tm3T%Ym@?7TlNwLVIyU-b~)7N4PX=#)Fkg z+|u6+8|4YXF4ROpQXc!N{K-4-dV~&Mb{iqJhZg(fMudKA(;&E7Q!|k{gZg2ha7g&o z?*Q*pU$&iuH>B(q_c%3c#f%BMxtsN(6cwOzUR}!wNsMl98l94?kiO;;+RXQ$OGS+j zS9@msA|$oG>x-(f)!}uvzv;?;ob820mpOX*R$N!Tx0dXQ0{|32H6qMH1r zD#2E#%0|vaL19U8p@oL%Ra$7Do3Xjp>z0{Q{#J|n7xFfk^nAXX(1|0SYy;6lyn5^- z6#giDUvadE(s1b3M;RiVEhr;zFYl9?)dkS^Y#kNqb((2q!ke!p-Vh9bOw~AFU;~tE zJbM}2=pc(Xr$xRpJ#ka}Og>imN6;L6Yjy#jGMdWkdU5r1c3QErh_~2w2s2-#Uo+Ph z1m^q}xW`vIB00w^;DHaCX|(>Cdm*JPfTOXj?0=LZfKkKD57%1I1pekZ5%JBd@{^v~ z4_)lDV1GJ02Xr*PzjRGV+C2E?5U4`NzQfhU9+iKV_x*=dSe_M&rG!1QSQe9+Rh3ox z3T)%=%5Un4nK>Ftvb=Yjlh^j8KmCT&LQs)^;VQ>xf@~$36(07R5VPOwtEMO#sw>m~ zASGE~(C;LTQp5|@!I!r*K>96dtR(qv^#?zZZj-yB@yjfC;+I^Y#37wXRv*CWCy&Q~ z>F1*nm-*UpyebdR`l{AeG09Z3#?-&YDB6R*jXkGV=+hDSsuKIsh~D14laY<%UlJ&O z6%2pG=C9j$0#cw=mzFE`j6x0L`@^66eAbM+M8_FlqRci+Cf>{qxE)D} z9Nnc=&Q8pFd$7auz@Any7gJqtjAe~E(jzbtQF9^fFZ^Rx*ZdWYh*a;h2r$gJ@}}nM z{F4Q-eFChQU3^9}KHf1_9!1>0mSg+xU3MzY_ETFxIcc2(zbb2(^(lJ`9#B$z6PruZ zr55|gz-`t$MgBPpnj6ejx0`8=w1oFzRlLgUl2D8kXO zSzXCs4C}QY<)EN#hH2Yd_;QsFzMsBTCg`ujTkI2EEd0hKgB3fk_ZTVnz^C>}@al8k z@dm*0N~hw;!b?0*cD+ir4UvyU-C5f|HdLtOZ?~Ne9DKEImfEcP(ol%x?K|N_vcKK- zLV|k#`DW>3-4-OGF5&_O_~UNi4S&)-8wgd)Nq*Sv|8PJ@DkBSFYoco$ zI}Oytx@gHyH@I{7&4tW?L>%@cpJlGEaG8%!7M{XJm&fE>+l!u}jn+6M83>-0D79rG z($E)|SQ$}g)-k%ZFXDWQO=vW9vSx%5mP2W@p6;}uxX&t}Vc+wBsz<3(Xzf1%`u+y` zoJY%n51oJHLh7FeJ%w|oq-05fBCR9BbUr%XABV#~28T_UJRf;cU~0L)oqE(3koWj2 z7C6=Xwt{4eMJ=>z1Qkr1F(pLW|7zF=geOdMo}KH+ysF>K<$>pzX~iIL)qm{+3`mwj z8s6SOU+C0!e)=&vX@HsXm-i{Vr|I47!0ZS*WeV1T8r)?52_3vMQ1`FiC|Je)1AX+b z#2VLSxt#KP`KF7v5rrVi-G||G4&-9j=lRod?@veNaG!CI9=O zeyd*Acvx7b2Ty4LG1TBfYW)U!9g+|kK{nEkX>H2};+78*#pTiPDP_P0M-EuP%a~)ly5@WBs0P)%do3ivM z-EX~!U;aYD@+LQ5s`RB#qLq%jt`ojGM5$OtQ9ap7yGd-)cj2NkB3oo&`iY19m}fwd zqK+%Q(G^s}@snOxn*53gF3h5kkD)~~K9@sKjG;%9J-31#8PVMSxDj&5pfyOV(<&48 zs>6N+a`;Ln{`d@P;N_E`Vc_RDI-Gw+P>W$*Cm!mAeF&@4XH0DZB|c3`e_A7JldOb%Ga*m()FA$0afV1T_DW>#pq%^**_zK)6vGaOVm%=-1m(eM?f zHaT)mfgEPsAJ0OV9ifK;06Pu)KG_;DAH;4>bvq&@zQF&oE1ZPc719~|6y9%F+aTS_ zKR?mvm0n~BdVUi6?W;X56QBRy1I(^)5Oe#bNYX7@-0kzOaMT9&MQ-+m@|S4$kY9}=!~H#vYY@Zd%1ATuC0L3 z8za?RlA`idxF&7i<-A>q1{7o zEUZ7>6&AyQvA?!eR%;F@*zOE#B`DU*MZz5G6Yf&aCi`1QUcWcgKs3}rJgynE;$Yzd zwEG?)u;EEp^v^Tymq3r%NICTF8U=URFbI+R z%pI+pBdv9|9St36Zq#c_Ci-ko?G9(loW9494;II7HcGjV&)Tb5Iy@2zP6n+J1mG%8 zyY%T06qK#g(SQ$^)oyToQB*OA&)W?FcVT8rP+%2Ca=?{SHG;l?$0u2rwGO12(IsVl z@0gMJdfiS3drjhK%<+!9`Zi3j)g|tXrLEfAMbd}Ci0(?MSag!0qmv;%4X*E;65Mfo zn4y@@5)G)pXs1I2r1Ya41agP!L{-)!unjLaADG$b1gPeG`o`-}|*WsX_LiYL3NC9e=V9*Hwfo^CAz%6C3LFvuU?q zMSwbX*2Dq(0`_2g6Y|>G%D=-CkN+5+v~^L8-fp4g(}a-~y%6?G)0Qn~eWb&}#${D( z$nO?-bKR2+G_-tNV;`Q!EjaNZT#X}T+>>~qYC5_1)hrV1%(IoE=5Y{OdCaz>yth_tmb8xBtYi0nIHz6K;Y8=RH?}rY4?PW!fY{ ztunEJfO6<>bX6zD2-mjGfC8N~UQDba=DO<;P&51=P4Oj-M?5s-AEk&)0aW8j=>JSn zsE<#NB-n>&swv4=zMcA@$gcSC`0Bi-U;eC6uQ1xSQp~(OT3mp?yb8z6Ut#}#evDtr zQ2T0YQ}X?0*}k7VAR~^hgGfP(?V{gVXO2R~6CEK(n1yOl%oQ4_4Ad1}D-KBB?3Mij zu!>mGV7K>2QoL~rlpHIQ7yj^-_RK0@qRSH0r{sB4l>LxiU2erFnv1cg(AXie&|!4b zz`uU|skcodN#5ddt#+br#FP2qcTNmV`pfSMCMSu4^enC8%6PDSFc6 z=BW?xUcxb{3fn#)Dc8H82=e=uCf5gnHkuECR_8`a*z`wl&m)bSQd}}b@yCr++&?yY zipCycL8@Ai{WnGvjVM$5USI1RK1yL>$!NXKYR-ot-fi7XnozQzS^oB4li~%W%KAOV zL?0`zaeF&$eZj!9#(A%%Kp&f&2__{!AZBd#U2Wns2^w1)3g>lS4WsrbniY-AlkKR8{^H}obsT&_koX-GDn#q}SS zVgoHkynT$WC+A)8MVh9mPxgH9CEYi(k2m1cd&Y`SE-qs*+crXe)IQNOI3Tb_=(%E5 zaF@khy2BB)AF^4`Vz007o7T|=(}NC8ag6>=@peg1y@#eUR2ZWn3}$z+fk@^|>rbj_ z!JgZ6I!DMsO>S+So2B&`oQx5?RN8?Jg0Q8FjHPZ7>=m11T0WbS!nlpF zXZMCucC@WNQ#@A|K5u%q)i~>%^_)#3nT59sX6Q;_mvNc2`=GSoZdj(-Oz`QCwmHF# zO^S*OdH>~`NP29tG5gd?FTzwR;zw4KlUJU zkBvTwc(xSzwKZ>)jqS}Arn{Wd@0|C!q`M?s8bx8Sr?TYYor37QUQ*1_+6Blqp6#i> zG1=P|MT(By$I}Mt;&ni3MG&*{`?Fj~<+sRvAgs0b5LyNq|5q58hURvv6b~{^@N_`Y zie3i#csxg!`K+xPB|VEIjNd)7aDsqk8txAhi|IoPt5+R*leCu6Lsot<>TqK7m$u12 zqX@Lmvf)EpwXM&L2$CjBT8#L4glCFO&RJ}<3JjJ7#5wdSn!L^ZM9jEel`xAIN>oOP zm*w0^YpC!dQj=vC)4UCC78A{xd!2qP!h95N7VB>i9<=Ffl950R(%#y#e4qc!cmh_g z`yT7)FUkn%E{X7jVaI>^KiId8^wt7G8EL0Cd>sty&Y0cG4FWO(AX!kzIaKioO6R}v zhx?B5d@0tV4~A|ZLjT=w?jZ9Yzq$N>?B)=`9sh1Ow*z(agW1i&{jr;SGT4K=k9>w* z{#Z!j*cS z@Xo8_vniB5$Ly{`t2#5v^~6mgECl4Z-4dejr*ouzv?rY1mXYuG`P0(^toC3|coeA& zFPiQM-xs42s+)AFR1twm{FC3iQa?Gq5VAL61E>8{WaN9W-dqJNb6s>T7esIXw_!C6 zs)4&FQzTq>ia}(z9dAfOrXs*FuU5m3RkH?uYleY_vlOW89*0o`!|?FJ9VLyIJdSic=xHY8X^@ZP|wfbb{7<5FrUDC zZDE(=FX1o=!=k*wnOgFY5J<=K^D+p{_9I}c$6ugb1WkMegw-DHP7p#5V7Tn|42RMDm6{JrSOyCEj3zX|8_8L% zlU=^|kLld**mOr)l#av0k4iVc=i$w5!-OzR=2#CXP;X63_og&X`=F%Gdh;D?PX9fo z$#3_a9&RAO+Be_-U?#fy;8}F!d0^yY{LL_~e_|=!yF$T}J<$9jGH#IlU%yV;5C9r> z(7hxycAO?5@rLz4>yqBiuII)h7d&J$7_khrFBk0wK>Qs9O&5EA+TZu`oOmpW)DeHC z##OW^6V~Q@*0cTY(r6quFmD;pSRzz=T|@*+!u5O+5O%#}&#V`aFhd z?hcr4CDC+m)@*wgxDL^V6FjvKRZ6An>8LeX^SR_jasqNIEL<; zY>|30Y5xr8d}el#Fr?d@@9AUw1&zPtoh0;48Lox!i(8#_op9s_R5@1dg0mg zAdT7Kfl)MreDvCwfmg4iUByVqzZqhxLWA49oSc`2CIdlN55z4Fd;>J1F+ix;yo7*O zo%}*c0uzn$o8~naye1|K6@qtgbz8*`v|>M*#G3mqI1?-tL!Y(8>esMDGQ4irPQOwU zMN;y+H2aA8h0*ytZ6Nk4oEy7QTW$LAKR=EF<6Tt8l^>N~F~%7yG#FvTVUic!-YH=VJA+N0 zFBsGqn;||T=eMfH@|5lyN)%ALr>`n@T4Q~LAUujqwKfJyRXmiH=`o*ixRJd$0J zL2+H#=qY}-H8_Wxd#a8OE-@Se=4SREY|_tV^dBfoBNraH0i=UdhRg(7t)pg2?CF^C#F_CaLtintYk} zb{J`uf3{K%sPPwyxH|gbFErYqj@%wTVfVT0Z2SJ4R+v|ikIa-QTWRF+Oh0xw%U^>a zrhw_WGB%0K*B8p2o;0rXOiW|Q$}+!3Lyb2A?Lb7|422cGY|Z|WXne@#*^p9-{G0*aWYFAWe(C0gO1Md=Qq$CC~^ zx*1p*2sGq4@9lg`Nffuz`Sg{YWm|$i%qfo0;erGHER~-^Ng#XoL{pUD&(TRM0B*68%uXl5?XfMrD&qCk#Kq=Co z!!>}ojs#Sw8~-V49YBII+|zVH(IATFQUOr>CvM|dc{DV#5MFu<8F(WpMaC>8^Hh{j zBm%hOCr11Lh({j>J^}>)Jn9P|lgT7IAr%0@zmCcR=u(*oRIV#eYUR=H=K^cxBm1EQ zuM~#!IX1GlLetm|coqsxeh8GS#oF>|0z*NFM_vfCeb9ZSZQPqy_wHN2cycb zgn~>`xbxhyxIhP|G%TABH0v4mRR6gCU+(9-4mJZHm4mx)JZC{T7{@Z@pB~x_%_G%{eo?q;><%f1j0iU z3j}mrij^Gca~ut|Y`dNtsrU4i)a8|4+WGWfI;QTmH^O=zam3d;8ucu7By(vncNR{t)!SQRVpMGOw8 ztZGux;u~c~X|~URd?beOjEf8+4lpWzh(gt{Ll{*Pe(OlC>4FWr38)Q|8DceBmzfRA zi~dMhU?uP0375tF0CC0tE!mW=n8(&!?s~-{jd}CdHFsS&i7E=aAJiWd6i^tzPL0;B z8|Qs2)i=qi%Tl8$J2uj2Od-|G!+sQBb=Y-wiimCpfAkB}UL;vX=1xbH1z;IFX_N0N9Jms{d1z&2J#6e}dHiH<>}yfRMKR~cD|ptjlo+5n znfZyR1hXM3jVZ2j&e)$8(_rPFwAu%pSP?8$C*i4F3YIu&N$`q6m)VdJjpb^oF4 z#USxgBYWV=!zS(=hNBl%Du)~?H?e1Cvb);yNvvdSeS4Vjjrp~{G?4Qq?^WHj)x1a@ zBi!~H*Amm#q?$12K(t}INo4P2Ux7RvD0&0QL7OtxTI1cM5tg*CFj>?<)2C+f)DEqA ze1A*zc+cJz^^Zkw%4b^J)b%sCoyEsGOu9ePZffAZm6Gvnn55SO2@qK4%hM|&wYM>+ zH4N`|mo!0YYg?dBuK@7fWc2^e9)w;l&0oZdbvoHI-Ywa+6+K6%g(%|A#i|ynh<>*wrJYQk*_`bT) zqu4|&&FO70$iR8)Fu=;f-goTt`-Ro{xrFbOQLkO}(oLNFYNOYDXJ*@+)=J*%QMGAn z31HCOZ0Dr=IswLJe6zEcOHv7^k^-4!7D>;X%u|<8v?L?)qo=6_eo_N0vheF=jh|eG z^}*TqhooD-dnOm_pKfb$U8o|kM>#3@UKi0q{=eNU~doB?(G~uOYBng?R zUS`P+q>Jwax2BH2oBuz)-a06bw)ywQ-Q6L$1$T$w?(Po3-3N!@1PxBG;32pLcXvW? zf;$9<-FNTjxzF#MdQa8)V|%XInVQ+E-Myx-{(idqV95yq>d>?$tL4{l?#dP^i|=nI zfbVq0Nn?;d7ruAQB(KJ1X6ZbyIoOu6s0@Tw-}aTWAmZ5+4tSh=J?Qop?P;;z46qXk z(0sm7w76w6Jr(v%zvDgS#8|y-6p1n~fJxNlI$7W3=SQhtNg&Kh{Mdt6u))b+_XX25 z*w3@)>WZ=~u*VSn($_S%XPwREVzmkyPX|cC%0@t4jlsM_CPJe{DAeW{`ro#xO&o6uY#>v}1+By#^l&o&rc#Xoq+c-=Y;YQUy(%wIR@AUrf=w@b% z(eX|~9u%>ky6ds-_>3PLEKn-yE=+DY^ux_PL@ZU)Lv#Ke&S?HyLCTN$^t{jB?JYN& z4_G15>Fb*p2+Nl%9bZnlYtG-d+!3%;{@7^;AK4bngr-9)WPhIda7Qiw;oI-5FEv%A zHs~NZey!kW-oL8!Drzi_^Yip9r3b(}Tfve_*8S_`+UkhLr>AkOKBnmTlw|l9mDkY{e-{x@cVaNI- zMcy+=NR8Qe=|mff7e8XfVLmw`gGZhnq%^(1jcJzuJV<_cqU0I)u5&A%jkE)X^9RWV zaj*^3i1LF!Jg}f8vabW;SfqssYG@;}11xK5Lp9(odzP0))wA#R;_0-XsxwvpR_3i9 z7jG~Wf1MuHEQ3{H{6cI}=TV3(D4IIa=7+Ame=LjtEZUhk{k%wozMOZ#$l#Hu78NpG zSP$>2-1;E%AS_IWrq$6c4&S$>g>;_oa%uO8Nb?Jbqyl-G=yNYHb9CPoN3w53)mbL= zh8X|H0BSwhfH&^O*$mbDc_>>RnK~(WUyX-DhPF-UZ4;Jj=yClUbl!YogNi|q%erAP z=-^yy>sHE;d2wqnar^~x5clMvfJ$9VZqQr55^xM~bc_>S-i}PUC|F3ut}6i*7z!MC z1p*j6)3L1*ioo4UONREtZ*{P^$8&4UGoS-zpSZ==1T)+L{~Fi5SyLDoFGp2ZdG*lc z2;4Hm8{+#CbTErW@}cB)RncuFS#7`hIu1IbuOzqH~H5a_L3+#J~)0R}ajNKBA~6qy|hs{#=bfyM+C z&J8B(j|D?mX#X?eaKC5FRUz;eH8Ao0?=JrqKL0~>z5w;{&IcF~VKv_-Sov^ZP$4Kc z3`*M$x}8WpRY>e%D;N>gWo`$k%d3RFZ@V2Xd)hq^PLT3n=zs%$_gv))d$RW3LXX``rP%JJ87o!A?ay@Mt zVPuRwm^$;!TbhK^$d{Q(OsE6smO>2m`lPO4US%z=fQTa^?&0Zr%_CDS>%C}3xH*-fLRgIH)pU>8(a%=a%-&rR? zrg}8iKl-L_m51tLCd5mywB*V zMrmJ{>knJAZZFRdT9)?v-&lroe-AI`s&+!29?cqkmsIV1rwh%*%yH*ys)SB*Cb_rA zYmn=hycE6r1MxbB+B*+6^q$UbZij64hQ%if`6qwR2%k@MnVHE7ph(`>^wqP|h>*?@ z$B5onmHcFVzOxxLt_OY^2R%%8OkTX2J8iPpIOl9llU7d*H`7(@H!UQQ-5rmz3iZ=- zB;|djDUKY_PmL1M>SlMS3UeBYYiV`~D|C7kN4 zkIS7&Y;CPYv$h%QKw)!kDTN+>$t*v1aS847!%$x3{Jz%GLI!}Zp+J7UK;#JsQ*j#! z^x=v!9E|lEvn?*SCmu12GSQ-4Rp#EkwPEd0W=JDev!Y`!;|>Fc>&B){c$~2gvcyS9 z9L6+_RZ-3p4K6nYLm?(5Xz6HS($Wx(d^$dl@d@y^#y%HyX80e^6-! z^@fBaM&V!z0p2Ore^Kc1U_ardYk$iWE)GRWYlmA5y`#!YRe6IWKw)C#aZ90pK;z+g zS5~|+a&MP1T3O}oD_9SWUy#L{4aY4g=umm_fGfaQ>Ne|e*s{Xyr`|4iWK}fbaF`>E zs-;^53dC^iSXSFEO6ix3I8u)@g^ILPpsW7fNEIsL3{*_dC!m}UTX`d#kYwvwj zF@~eRTb-SI#8e*du+&LEr=)mg5A51V|C%S5oxph_4(kL;!Ai5I-t5tBGbiV1o~*R;g-s#BsWdkA95l%jD<_>)m2t5 zq7SIhRxTi?p_ySYk!UYubruUE4P8q2UH1% zSOHMqT545>fs-bfr4c}%lua-aJS+0Qe^hYbcij?_(SYG9DxU0XMQt}A(I*{3@1?Lo z`q}cFk3swdkw#qzGpvfyfur`D1dM|J+Vl^v(@|vw;`J8f@K-pbCkGo+b&k2hq-JPr zD8|3e643BrLdyu!p@nX((C~Oq$MU3D&>>Qr2zcs86`kUKuA@i#-m<03c)l441Q zu^PEwQ&x)@BZPG&LRSIFU^gKMAB2(Y#=FV4r_$iyWs#!9;N&v)0&vV zue2>``fBdCka(|R$cx9kQ@sr+``%*E1^{%C9LajE$Di3K3n~N( z<6KELA%#^AB;&6}y~98H37u1k3mkdv1m>$6fuwD;dzmm}kKimygDA_AP*5Q&$N?Dq zvXdzI4oB)Td6~)+jeh-E6h~C9**wc+H1{Rf%I{INq`QpCE%ww&3&q23`<3E=#_p&53DC1aX;aJV9O-MD6W_grEp7AS8en;nV6(*CM@2|Zr6u0@a3o#MV|ru~ zA}Z7KHiQe-eo8XcoS`5K@aSMj+qc)M4qX?nxCCq!B>*Gnj@XC0*EGp5aFa*s&S-3s z`736TUxi7F1$u^`ku-){JIkIjAhYpPe(rE$1v$Eg$TYe=;N$C#=3A@7D~1aDU@;neqc`s}RP zC6?X#UO)_a@Z9!^DUU#v!l{hb&lOZ;N@!E|wab9wF1Bbvk8a2X8cfj^^6vTv2xsjt zFO}_t0?HR^%&da*jv>?Z?IF6=zDLOKlXbQlQ5&1vzA$7AWjFJ1SX{E~?Or%Ump{gO#idNd zMJy6g0jg72SOV!(SA#nNAvli6ItAfuWv}8!+r2WRYTvOUYpQ5Hk;(0mA+5;xs<%H; zMv~yU0G{vrA_u~dDHFlAIsjd*KL5Ly7_BO5I$lBK?q(20B3KqK`mp-SEDjq9L~8!Z z&*l-~h5n`o_gALb+;i>ctF`Wrj11NlSOX?_?+xtoIdgydQZLe$C z@DB+SI$t}yuMB{cdZjKFhN}A&&Ibc22IV~JO;lOjS9gw|3`NclPO+=6J4mB3rI_tWd$UG<*G}V)M5G1 zM_bYaI;7}D{yE0TQ2>9rab?{QTALPzRr4%YaBqz8>D(@G!Q#Sf35;#RrAKP`%f&?fkrdU?Lf+Sdi^bv%4en@ETv(F0b`tcnw>*-=^xGA~4V z2rhiQiW?&JAk81n?8?CM@kMS=-g0_h?myNS>TDLO+1AyNDBb3p*q0;g5SPOJ#;Fq1 zX=Gg(MC`L%vZ224ChpkjKwF9n9H$)BgSf$R1c1mQ5Lxw%IWdP<2~K%d%US}a(UKEX z!ml3(f2EEg1Da6O@I{83U#FM}&uTwsXK--`zUKgcS@1d>N~f(*kcrif%u&Zy6hOJ= z@GnBbO!`eneX766tBHbQ!*m1_dDuk3gpi-A6^Eh8!Cf+Qug)nSqiJ~hMQV1iMl|R8 zQZPHBTL)?U#Bc^Le0)z)La|^uupH}8R>6l8iBgQk1K?SWkIp1-x{PC0Ty7Dt&pfF5 z3pOaAdo7eW6_-XB)F12yrDb~QfNDzCFbUJej=2q3l08(Fegz*RR&T+VmNI3}-$#pA za}<{@K$0rPZWssFbZF4yb=h?bgYR2+cU(!Wmqu#9-}Ubh3k4Q=L#<4B!dJ0HgH|D^ z^`KA>z)MC+O<^Z%36KhrTHay&Enca=X(-mdjFmQ!6j`om9}`;?o^&Ar*-ldn9!a?hH`SsW2Ij;8$FJ5zb4wj@{y%xPzIh|7 z?n>7bblotJWVabl2vs@mpCn>!1x^%W?*`Tfh@r23qmpO4R~P7bud(9L`Hf{+V7+Q9 z9LO1vg_A+KK}9i^5jT$uHQ>@F4n=a&6Uw zYc@sNnpmCu+o~yWBk8Vv)`>RGxv|}^^7~88ra;7D;?6S$}u zqsH0%j7P#$UF1os@nmU~Iim6Vzo!WJV^4Wpa4BsPctAeen5B$vY5IVhF%bbyJivih zjCD)hhDv<7Ew!tlLeZbygSFUf=V)?1&xpbVPzq7!QIdJS=OkZNC7CXip#}4r);@O*s`tZk#X$`H7zcY*< z;&9qF44hyx?+Qk(xaEz5T2?K`O34HPp*a6?O|el_;uORKP^AoE2<9hIrRyfCn~+_r zD771t^2bj;yM<@3tR?~!iDtquIx|h3jgWQtLto9!35 z%G8S-1m5lLhZYm%bDXNaAb!3a?5%v<{*@|F48l2K|G!Lh;j{2pmA%)utA}cBW4*W?Ro1peC_Mi35zTtYlmZe#+t76R znck;_cW4X(2e0uQ$Uic1xGi8~QqhB)+>)7W-cVGwW}ZN3(~{ZE#3*qtTWF=q^V2B2 zZl=qBD)Hdj6WA(%v(~dlg8Om;`?ryRD7^Lir?p62Wr03OHx9@7_B`f0I$IsO_x{?@ zbraw+qPiUL1hO^A_xn?ib{?gGh7~BSv`_U15W_8`J!9l+N(amJ`Q+8g9L3OTLPGa* zt+)q@DoYi&k7Ca9d5)eCBxYA`-DIl)XnZA+qOz&>b3_N!eRjzv;xzIUJ)UsUuR>)0 zq&Q_bd`M*+QWq%C5Z7=ZiI7`OYFg(>!nb5iwlaLeRr!+mCt^kf`(@(SH4%{jub7Vz zfvGMxZi!&rL%-vJ)R<#tsdQ6LN{q~R=Y%CE5wl+(ahv5<0l!B38Yg^yKE+#>s24qy zPO~qV%bfneRLSQmX2Ni3C!bqtJ&ep*F-y>v=0_4_UJGgjtbCjigXW4w8{cNAy=jFFOV?ND0_*t#+RW!Z8Kf(}qrz5`W|X@7 zTUlVjziHB({)M0}!$s`x#ZF>P3Cr(z%Pajr`2rc5ExF1NkQ>6Xgo}YGZGF2I{mwe`-vBbV2iqW~7y=e4S()+8KE zRtDoq3;Lk9BaSwN{Z9<#pT#F;AMj6DrSNK79Ma>rOdDlXo(M!FPlZnRzCw`zu$kP6 z!Ny`VKH;;F45L>Y>bp9!4th;{WV9Vo{gztPfF?p^lWB7n01FidtpcjKgt$Cp1V7S< z6f+4dED7kt*c=Wea8xIV8R+Pa)a2(1)#wZmM2Vwn+>s1=eE`GscHIK&t3RD;F7dYNiS;N6 zFU&Z5HuyFHmzs4ZHr6i>En;2mu61Ci8gc%tLL$`qgxvV2RlP9a8P|2V$Ps*i#ONlbore2sD~3WQ*;o!ehld!2~GiLR(-uf~tZ@%?IMU@_mZr(B2(N6b%{e~H=&`H$aD z7h1c+Ifl#pl5bMe`w{HO2Jim4DR#nF11`OYM4J|GUK!`-%gKx z@>CzvD6+)dqC7)NJgU&B)1mlRRdwL7*kERc@s)-e>9c=b__@$<-80A_8RX^h>RK27 z?$m`v<0bh$I7%KA8|T#M)h)ifX@uBwYi_N-uljU#@N>U6Nsqk-A{XlUT{hF5RvfYU z0dMQS1Y8J&O8B3DXd;xm8Dr>l$}C64-{|zaf;LnqDi<_imajYiSznC{)%+EyDy*~m zD5bDl!(=G+;bYRI21T2mX=@N_LVm-^__mjmN6=$E0j~e;Pr-*leLw3>{{vj&YFOpR z0imkK9}(X23W&*VyA+mSclDKGq0|fN9%UK2v76Mwn=JiunBAMQ0qR6$1`is51G2Om#z7H9O@t+BpZSayMhyy;CaL->YE5@#6S`IbyJX4! z)DcM^&H%n5c445V>gcn}>8DvKa!u$Q9K)yl;2&>d{8>P!lb+=jLWSuqu2!`y+Z+pkYePCd*BAR67lGXk6pS0U)32_$tdFko;0xiapGfet zx!ZlGh%~B7r=AD#6MdVMYasDUoghOA2kfqD*lRDUhiDt-i=W?Y*r-Fc+M0#dew~O-JuXZWJ8YLC=vJ^eD!n?@WnL|YO>m${W2Nv4U5Ci=Xm(5_C zP18|V_N;@0$+FAvbABeecNR+$%=2#0?_;lG{F6b!<^67C^`FRWm@|9au>UGXuO=oy z=+({FD0q95rZX-x6J}$;Y|@pTu+W&Z(1j>DGa*V3y=^i|_en{2-tL83Adi*A-x5v8 zD@rt>RVThcx4SH8rNmF7(Ya?@_+UXGn>(?EcQ&Svw^SOUF)tZm-8x7tkaJPWRekxe z3vHsYEF?nnwIfgCj$kl|K;7~sUNAGAA*4H7E)D0ehg7@@D-l1yuP;=-YY7#EN8U{A z-rcnLAp_CUE}FrLrZ*>qA37;wzFY6$puVhAEm&fzuJy;7^5@_ZlL({y=0sgRPYk2U zW{_Ce&%L9l^LTZA#G+7o%cP^f6w^(ivi_#Q?J1IJI%Fv;w-0@1J*5ex6)$3Ke4o8g=f!yV2&ubY~M0f7sC z*HpdJz0W=fO$xbNsA|c2auB0 zZHN0^<@I(&uTbQ&-F0Blfgl!}ZQou+@2O!xIVw3As198LE5R zh#!f{r$p)0OIU&rGW}}wR+n16*Yx!$?RXgfsvQh!c^oL~uO&Rl7ghW;Wa-hS^MYXzbQ65MOvl=Q z+kjBqyALV9z9&x21&d4PHvg4@f`vY;ac8P&>&VY-M)SvxR;eo+c)c7Y@bg(-nOZ`RtJ+hw4QT;YSQOE|Gkd(j~~ zO--nl^TS@l!nNASFj$JQAaYmXUt`KxFd{pQU`g}8fS5s9M9J5ByWPEk>$$MU!rsx< z3O?8C#j7!`5u_DQa4|YMm{$x5VVIu&oPke7i~>w6CdL_L>1XW++_>)eIYnM6AQir6 z2r7{5o_Nk_!a1Q;R{BEwE&%7N9VWKu2%B|iISaFhpSy$(Pwh+tI<1AG80J!ZXf)aUMIsA=~H?U9D4HO;&z z(;Z*x@C;puLEvKa%lPN0DG+wT=szm?U3}!&uMf(qZe&4UOFbMWU=e7Y36%HCD=_OQ zBD;_gAV8rWyCLlqv_cGb-0d5c&s?R^XpTD*C#rQWux0Va_3>y94UYLWP_-qR{MT*D zy)D5n{zGDX#c8Uq!PN5N#n$)Kbljt_GYMbm_oWLVc!F%+mt)Uz&!r5oh$V=0V%``Z zoVFJWvP*d?BtCu}68bx{iyTj&~ zE4%O|v>oU{-lU+yTeNF6tBuj-SzAGsSMg4o%RR|iJ@$>}w7x3Mi~P0CXMA5@FL%VS zGgP*7iW8@uW{e9Gl2@lcTp#0lp)a#h@!bPv+K6nXMve!Vi>UZGkGhE~(_~1e(#ajY zona@$#U1CIUcRHi@@W3~&@dKfiM_yxx?}!Hq~4tT4AXilhi;~KvL9uE zFW1`wtB0Qx2m5BP9tW+jkftof4^w|C-%(ET2sW9!jAVl`ph`LVOUR+TUBs7|QhXf_ zKb+1rM45jxJar>#@b+K#c?VOW9I?)kN|TYK?LKH+*qRoYdEt_EA@8zD7ro_@H1Ku9m2f+_6aF2EJvR`N@7Cl{@#}b{k&bWT_kb` zE=Va);^8HMsK6&!)~Va`>Rc~ITBSzJLD-+mg^gl7@$9^*!+tYZCrI3E)!#K^vyNTx z3rWt4C9-e1bfmUD+Ry8$F^*G40G1`VMua;) zt%!yf{x5P-t@~X8RHi_;FDdC{n)6w|otXf>q+v2mL1;1HbqkulC{Lw>*-LMQABxf;V`bYh(8zZRDvz2aF9pXecr0?+XPW>H`bwEqJ-{XaQWLatX#jpt{gqehNKIYhdv0(L)km)rPr zvy-C07ZagnFx{*eIpXSX*G-9lY;pZY;9UBPo$6O@ql61?Gi? z=`DAPstzZcbcO6F;#0G*6+!QHp8-;qtO{T^&bd3x~{i&0&ll)Ia2?;UL7W1d?CN zPYHftRm2qUtMQF~Ml}b>7@kS21Ynw3rpfJQJ=^5_4?lwXP>;9O&9-jpb#>9t-WjzK z(;O5dbSC@{(*!`ErU&K!KutIK|Am^`&>&Egp_r#zyhG;95v%HS!gi>AQY68AcEHS& z$<7>xKwI|9Pimbn!b2*baQ0nX1iuK$7c&<^9nQ?DkNKi3iTpXa`o+he5S2^B?^r%I zQG2Z~^jkw37cHaHVuC~?&_mo%dc zW6ku0>WRn&Bz0cuBQCyv>W9B+!q1E}Y-)AG zF(g6hBvC^FmThh_%5lS~=7*%HUsfy3jHKwJXuKz6Bgna#2x92)-bvyH`xrMCkR#{l zJJ8ETvD%~P!`}~wmp8c8dU-RsN#Zih0oJK<5;WVq-umi4rUx6leYG(}ta6&J-MLgU z<8;ql2=co$S!fqmZJYVMmeP7bgtH7fZ#&5w;)_RVr8FTM)G0I5`|SoUE1&Hu7D7Ij zFjh`jk@t6jO4}M%$AsWiUfxU39>IMsFTmQ*xDJq7G*%k6qYIbC_Z2O`I=Hdg15Wl1 z3bE4VWtgTfktG|&l(3Z}QH>2%Jg3^#N?Ps|4OMQZ0(`U+BU<%-I2v9V#UaT|;ss|? zzYb2mPM5r1boUNTew)#h#dL8Poa}+aG2E(p&)M%V(Ho>}(kFC5nr)hC+x@}2+*ocEY3S^J*AM$Oa zacbFX(uEHy&q2<`dz#tsW2MkX$5yj!BgnHtaBs+_0=Z-vM@vUZIey9| zVcWj&fcvPDo@#5sJAeiNbzT!YONgrPzC`Xg-jE~PtAC4?5$X_{1qMF_ea`oB2bRt7Bk>`L#uFoc&m|4dHWs&E zu8(Zo_Z)WSR6`C^+h14bFV~;$u97!{wO;QqGGpBrs_BIe8$SZkA7abGNBu|=4cmU2 zcNsLi2g8sd9-JRSq_&X2k)RHXkn7p(z=gjd)Cq^Zdw+9L(@$gd36PJy7GwuC6W0_C zf99@(gQagD=H9kyme@>wfu~SJRGxbj!2HKx`nRo8@NYfv1J&Z6FK8)e`DojAztZzk zybrVFtI&Ao!5ct2=MLd4;91xy{3Gma@4yl?Bct zP;B#E?If_}N0g%HHHD?|xy>V}uJv{gPIe#j6DrUM01j{riQA>vc|75P{Xabn;?1Ol z`V<%hj^P;cw^dHyC_jx1%PG+K>G6aYMt`=w##LYuaDZp1-7dw?YYGqil(RQ`13izT zYS{O`4wzaV{BqKqkI1tBYC=O_w=1b9tL77#Y%;nkb`XSa_d}2z zAVXACojDlC4U3@_v}sPY$w<#@lPBr>@CzyAOuKzfRa0j_{JtV0x-;ZzETnY=epNFx!csL)UMCr*3Q9+Q7Mh9WfVJc=T=SL#iJuh5IE~Ro+nU<&&(ec%T=p=<8HFx)boUi7$_2l zKh?SA>9ZpXFkVxz5?X&AqYbPn-gM-dLH{Nwz(lfkNTTlPR%8~J1h+|%mqQu_Eb4|k zVyga1+>M|_cT=>`=6T$Ksz{9}52wU*d-UWXef0}nnpL{(!$iVU4UmZMOGd&Y_$m)C zPHXNx#H9?Wz@cl$IuJv}Xx>Z{`wj_3U%OTwDI7+%pqJ~PJ@P_h$R5FhDO!kn5$CV_ zK7OQl7`2$9&!K5dZpM(396%yuAO#udE>Ke7p`N@7t#5t8I&%;W+%2HEN1nFP$_Xg^K#sX6NNS{d5(636oF z%2KxWVZWQ7n#-v%f2*Du zlTxMtChD)rlF^ghaF$xW0)zzk9W_xe-etf#HACnkI^{Zpe`sb1;Q?3L8Z4YPXL^1n z@n)vGfZD@(p%A0K!t=}Ayj5t|U+R{wKf6Ex+(+xa<1$%X>89*KfSSZrIX{}q>OtrF z?Ze0ZlV!Ci27XRMXPT)yx5VUap3z46!1pTu$~P3t67fO)sa-9jEBd;L6+yp8ibZdN z#MkuJzK1ag&^snp{dF;a!p#VoSP+}B%Sq~>n03l8H&9Fn1xz~)Tsp6Je<-I#aLqif zSE9jq`fpU00Y+wott}}3>Nyu$%k`ApUE79jsEcg-K}Li!cvx5kjzukum!9!l^1pwq zydVEX+7$7^J%n0}M<>srwV)L~aq{ULmu}Q`i{r9u+VxTZxyU{E7_z{By(h$HuVaI( z+x=asUzR_5p6Z4Kjs>|58SC>d|Kz2tA@u2CW_7t}vUco#c!8yKE>x6!saS@f;Zn3` zT=31#=mB70l)B+guBo1#3wcye_@swJyyN-@_k)jZ7H@Nhn@GmHB6AaPqDRciL^njaI z5Y{kN89VAq!GHdS-$z)KqT(N;d6Q_;rKEV|q{DoI;5IMGcZ!$btI^S4pT@3N|6DP+ za}ebwgzcHr-nTY1rkPvboNaH(p8{=wAz1Vttc1*jyx`FfGLRapBspv3fo?LO>s)!; zdN6AYgn`l?lz}R80gDfL;2CXzXRb=Y;-hciek@Y)olS84goC|*AOkOyB@=lSaW#Pe z?7RnxW5?&PUeL!dYf`%?ce;{^FL|FEO>@T#fXO~eGb30DS2Ma`^Ru%@X)+*4h!2$Y zNz2Mk%J_rbmv_;(n&(J%$R>H=T5Ls1r1)Mv#*D1u`~(ybv7cDnc)F+CB*%!iP?T>o z#Ez{dy3OfgSDy5zc5{cE!^-}%q zuSG7MtfG9=gbDs(Ror5i0}qgEg9*eNYg;hW**#Fyj&w3lpl}upw^wJ1yE9r0x#^*d zEjdJnMDyG(cb`dr(>2!UlJz1#G-W6nlq}s1ZF;)EmR!fDy)=36a&Eak7DX>t{7u}* zp-E7oG_~c&S_=X2HsyCC<9^$Iea|<16Q^Qon%K|m%#AH%Eu7J>@Bk3yI676&lW$bv zsb=KL8gdiShj$yGb`~B&9LByWMb41gMA`4H)g_%SU7d#iL{Belk2?d&H=6WqTret+ zVyqW-v5*9!KRPXN|z*toLw^LzChZVCe>X}P*r4z-2c%Or7Ex5JzEp93fU%U_gH z62=>433UX@L2?lgSR__03{Q z#-8V8{)g=i9mZ|IP-TLb+rlogH5^i1JUtF_c|h{K^2>I|ZYF-P(rtWHg&E$@7cTH~ z{QO4N@OV~~5$3J%%1x)|(+cYFxTw`N1oem?YKQ!@0nLzyDt}j&o?DrahYbG*o#Ts% zT^QJ3b?OsT^b2}&MH0tN~J8Hy}M^9TQS50IT9 zQRx#>(jWPi9vMNNqj%OK)J~hJcmjEqh0&Z9Hl1}cwCAwM)+8S3-=o(vKbRDz|Dqrf zd4goBzeDrpZ->A=ppswkS1J-alT>wwzYcLxWvM9Y_RV(u#93ue|6XXa07=|D4%}s5 zo|S!riTvUrqvtt3@DCgZxLFX`LK2T=aZ;cgHTh7vIeu-i6q&tr-Xa|kYEITezp~d_ zrw>9>k&0WF#W5c#DT^zaU)iNR;lQX|AVShObd2^rz|lo912j7j6CW@9NQNZ{;-r35#Dzg=iTR5?G+`o|fWNC4DQ=E86!IW?yMnpcgKdC(U zyt*r}jm?3e#L<z5iEG5GTJ zBf%IF`7)s{(E%t+W>4qFSo z=gsr_2`FoKCch2qir(98L=-vm?Wy?IWy@2+U7J_DmIJXxLQ%0>E7fNBy7l;lL0hjs zG7cN@G2x__rqw^nxGod4nv&cKA7ExBKJ>JV9FS0<>~RCEIwVv6+-okST!o@+Z;#(f zWE;gk;5zaoO0de+G(q5A{Sf<_;NOxZ*S5-fX!YB$#5qCbifA$xG4xi4x)9((HJZMs zQZuUA^uvNHrqaWM5R*`c(wnVvhHN0Jit33u?_!t1@wd5 z`rtl>UzhUZ^=<3H+RN+3gDR}2QjR|7y6MpYy>0>oVJ4rgb3TQ@q3prDabQYh5Cj6& zB3L&21a4#x2>8~N6=Bx>;F;iZt2Z`MiL_Xj0qQ&5_59;&cRPh_-! zap7#&YZMB0Zy@d3y-Ojq_yAT}d3cy1Mo#S>g~pr%q!46%rX2I$g@FzNUvY%c ziwP0=<_{88Guhb&L=l;j3$+w|%8S&T;efqgV+qstrTVzy4tqcK zlOr%y9ac&KJ=Ug?N$_2BdA(@%Yv?#B^ZCf+VQp_>h_juZD#OjpL$Wcr}9#TeaXuMB3~jL zo7dCJCjwMs%nda#Bj3FQMoG`!m;3dO60WeC(FJ0&nkvBR({=Z6|?gdc{KvZHk$HTMlNDPOXl~>uS~#{)<_Y zudzbCS?Ye#C_6ioiQxzZe!!I52peT-QXwxW4!=WUBu+{9I-Vi;&}$2~Y7NCyd|0ae z6zT+Bn!Ffr6w4qljsrg;8FHu*@?d)1TH8MzXmy^i=GKETc!JsNjr_JxMOmSSHk8y} zh~$Mj_vVxN+CHF*DUCRY3p@4ULB`k1tY#(h8iI?ow6$BXt~VV3E5>Fpb4VN%Zvz#X zzP}ubnAP}KJ`%Nze>`JXGhN^)NRI2#_(oYIVL(nHvvXJo4L^AYPpRO((DG^8!asBN z`;gbj`{8zpYnZL?L&_EJRgsB`Q)G!r<_6+U8TCq-iFAA5(W6t7AI$Co;3;C!^8`4x z@zJ!XRjuoLk6|5D0lWb+in~7ZoCx@qcrskKz}J%VQSUG1DdC3sFF&r`D!$)}^>iBt zJq3sO^7k}G6z35;+*`y(wU=aaf34oXV}>7ks2*AxL6=duTwYdhw{gpM;_)Du$2%Fa z?BO*y*+!KtElIpt`+7~pKe&6fHeP5CWm!*!F9#`E_xS2*1sulgE}!@BuaMu_O|#Qa znZJ039Dcf9Dw}@hUZ%q3!#S3NArM-LJa~y>yrJWpE16p#&Xvm&pMwG=)v?7;R!p6O zIZW62>fSW{d@4#P-apH*UDJ43c$Rz*nDTRPZ&W28`bxSWB|a`=v$nUWg1SIL-pAc) zjB5#5@8JbM0>6jTS8`h&-lQ&B)jDy7b##ptSI=9Q zg-m?R2tw>N8TcF7RviCZS0_jwV~2B*9E7Zb2nN!Oz&}Z96~C_v`yNNH7_P5-!mb-u zw~tqeVW6;~z8y?v8cZDPsI2m>Z%B;-=Uq-@MOca=H``maa zYqy^ce0@N{@{-m0+#ac#Qgk65PLHFB5)P?ZVVGY~=Q0p3TVy>3GdXSmgMiJ!m|#BJ zkoMW-*Nee2GZgceMHwoUQ+00)h9adCw8eZBbCQ!0Br-fjfp1UF`f%uuI3$suz}7|c z{3YXKVyCTs!J3&VZ0fN>=`U3vGbH+T5Sd$c$AKyQ3LCgJLTilYGkt&Xzu-|8q0 z8NH0iN((sYrB>*QmV94noi^JnTx!$#OmpLJ4_a@B9xx~OM}c95TXOogMte>`on4^uZ8MX| z2%3oeCu|};Pk^Z}w|yEbJ1Hj~me$?N>Od%HGbv}n{P_JG`WGW^&6bJvbkc-B3f(xB zHeOQJpA^-##;g*drA1JrwCYl01wBqIEc_|R5Wy$p5?9RW`%kZZnrG5`*vtqjbNlJh zwI!_H%H~NHp>!&(I#r)eG=U zyU~1$d-drQJuJ(mtRN~}dMAq) zPUJ%j84x%lT#@)>x#Wtw{_*_>D*aE<3r_~C`Yjx6T>S4=mvWX2H1%6B*zw;NySB8% z;(T~6p5J3OjEaQ1t!okW>=(y*qpSGG-WgC>MnGO~IFZ4VVjP<$-qTaNz_2Bx%tTkK z@#-q;&meoI+w(Ibe!_>4fIW|$n^TBylCTA;c)ZAeI`4{LCGaWK$GT6O7+!{`v#<8_ zyioMLqLfhrQ<5F0cZRMG%Oy9(*|ru2low^@H~@ZUF;Hs#mjqFx~&( z09%>Y0Aji_0=*Yh+2H@j+FM4&(RA&?xCVC#?(V_e-8~Q_cz{4~LgVfpBoH)s2<`+3 zZo%E%-Dl=Z?)!P4_k91(k8drgRoz`(T|He__uki*Isr?ed_q)2R$#Dz2;_mtAjf5! zc)clNY7nv432Hg76YgI@-Ux8{2nbB^zN`-|JPbWpPh0>4+jzG9@{C)du;j`}7lD?m zDj)Q;q+uEG-$}z_;vhbxCM)B@xiX=4=PCchj1Q^L89LOY{dXk5y51qA{<3LWj#~Qp zR_)niTsfbGh%YgS&;Z@Kh)-3xkl0B$1A*s)_cfi3#nwuml>XGoqvai=Zf5$581V(@^f!_)7Y+xrhHyPG@5>bx{E^> z9u#){Ouy0kV$MLLIb#8?>E?#pgdk-@M*6nTUe=lQ)W^HklL5w!b$6~p6J5Fy7QL^- zi$Bf~l_HMnQ*X>W9SPCkd+%L{wYS?>+KY$x&hlZ$&I!Q~ zfAr!fCoBK{aY>tnwYj?1RDG)8+y-&K{H%dX2TSED)Wc1r>i1riSO1fal?Qj1m~B9v zg)<;J?y`O%bixa>qw)sJt>fnUl-B%ArAB*f-^|!NR^zOAB1#EALe*@O=Bu;eTpCr^ zb2ij9YsLE&_}rxt|M+wtO5kM!N>>yzuKCodw+Xs|f_sBh+8{!{NY__q^&3U0_$eI7 z>NERcB;P)A4?4`rVEo_^rjU_%GbY8cIRT_`D`*re6{v3_Y2uv1C>p@*2o6Pkc4tb@jt@FQ?;)ezlr&Kve^?DtCGCYp~vl zbSQYz48PW1B+a=8gle?>Pb6k6XDnaMPm~dw=-9|A9bN&7v&>_xZ~UXqhwPSzo#@9;w07Bxah|5`ywmNB&=1F2 z|53lK=FZymT1j6(>z@v>w9Kq50N3@-6Y8*!9cRyXXy@$$ao^kvYC^Jg*`BGMG+GnC zYi#MXUO`z~>$mT;_2$#tP7>M=S{$b#M3dIyKauiut#@no;3LgHjnylYzQ)Zuv|Ul~ z^jja7p7i9UXc1bPRQgcqyorI~Fyic4C_0bij-8G)cAa*ai@q{v^8-d5h~MfUj`%v0 zb4>g!xl&q-GGQv0+%vE5UjFrs{dxy_TxG2@tv3}S#B?hLqec) zs$`p5B~gI_X2aj;sBd>rXZq-6ORXXw>gdTsmYh|*aL*o66J811_Rkjn4Kq>;uM#-o zjMZqLi5rZ+_l7}e<*Ysd6d$Eiv@As%`5Y>UJsQ%gWOle}0Q0A(B=`|%{(!Mkb-xIC zk{o4Xhc~?_)t>W$p%v@FXS!Jyu7`c97{VX>_Js=)Nq_qmc8I(}kKNtQ>X55ln5J3k z8=7(^IO}-D9=OZtH5pY5YUNzAr=+@n|I%7R{L5>-l@@tvtFzJ^y0VrgYQov`L|FDG zI=i!x$4}-0xEMvxPh%;D(F305tO~|0wrp$m3CL|F7|`gRAT5FT{fFgW73vreg5Jd# z-I33Qr^j+E;*Xup4bM=A!f+%gAnu28IC+0^3(nx^$Rh%7Wzi?0k|DBIARlZJ1Jx7){vJcVMyf6ch7umOJsgdi zBYVT)I$0 z5o#nKY*-cQ!Ga+48=>ArIIN7w?!X{JIm!PT{sXv`ubBBL^>;`Y3SX(Rqx*`EXVkzD z^HPzz@&v%GK=3GI zV=g28APMQ3fNo~uj5VW4pe3ppW3f0=YtgvmDj0)h=BKiJ$T*4pSZW>01!<EzEN&P`5+@o^a{D^94WgQDqB!d0Jd02XS?7hD{Eh&FTNbdr->hIxii54dWtj8aT{lK6%dt1eO30C(M z-pu2+JEu;!bv8S@pXJSx`s3TfZ0F;=4A_B&=`hFQY%CE{Kg6zDqOvF7gpOQ{j)L_` zR=0(3Q2Eg7c^qNw`+7I)Pipk`Pkk;Ma`XIbK?a4)dC@$t-WGC5^A8t?e&YGE~keTY6(KGcKChXw@37e1DM_{Bu|9eKk{)Fks<#EIzS08fQ<9)Z=`8=)WNEJG5qHTI{1p$AA~&U#k}61iAMdnw zV!aGyR&QQXB4;BlOuOv^1eyl9fzeS!hjBDy`Fjl7AS?#*2D6Gu?g6ma zff&*FYzR)$pORC9akeO_!C@f}^M_N|-$0KgAfZxv%`|kSRQRsh9Ea;c)e^N z>Y!IIqsc&MlskZAq%^%V8Vg*b5|q#j!KcPnefN@@!mFdAck~5nE+9*si3$fmD0n{) zQaZ#-!o2(TWda_OuwU^A;PgPrW=H~QzE3*+OV`{5gdtobz7qf^Z3yRUx8yWc%Sx|BGd^9*^&^Kxthq+TYTeTdYLC|Q3d z+O`_MOtkfS!d_$bE;zpfTV#@X?oo!9tx|#a#V*2ApAC4gJX0Ph!>7Z)zC>6!J`4fG z{o%PU`>Qk6*pO={XY51ZhOhUh7J0nsBOYui{; z3$#E_dZ4s`;M_qA59ODH3kV7XTJ$i0p|h2m2twN@A^k$z*L4vI!C9ijfuIXRYEGfO zfuYYY^F`vX-=QV(qJ-#!`DemgM`-@m*X)Si2#|!h$%sb)5amP(g%G_1um6+0CKNJH z3O4t5^>%ae7ZiY#A7I#K?C%HTnsHG5lf1^XyX+uU@HZZNw@n?aSeu%c9qbj`#6{BD zEZj}!%4$C1!RnIpB;1Yjhc|Yxz7pp>LkOyhQFhV?4(yWWn9GQ=(4Vv|2qn_Oc_Av0 zxWqFAAk4q-CevnlH#WGeW*kVYPUg!&6<)Qu4`)eC=E;%orPC&jK3UfiM2;wmfv9K| z2Pgg@+r1cg(CSSmOyOU^x)9iaIm$5w*N4LY&q>P|rjoDRd&d#~KDK(8)zMQ1j(1hv z%O8vb*H#5?QYByM^lG5?aS5FKtwQG?`lMeHQ&CZO*0&5h*r&_K>N&VRZ_ICu@N|t@i z=7S9|sFw-Y5R^+!QRBeSJB50fka37(8?-wJ&J(2oWTF5)O({^p5#sX&!g`_i(uJb3 z2SLh$C=6_e$UvWD!DE+|Ov-!QcabdscUH0bC+PZe(DXIwb`btt(EjX)R@vtSV4peu z+~QPXVq}$I3HVxdiUzIEd4}EP?O$^gjY^11Y1FP(f%X?I+JYYTR~M?Oz&>x@-1JGD zm;BSHn@s=6ylQY+ZwXk-6?j>ZIB)cXy`N~S{k9MG5oi#phqPyr$=;YJTzTgL@{y)fcTmq!50Z4=PGbi0m*PJ~BF&Q$?bJ`^dg=PteND*v~-tZ4H zm;M)-r~e@H^na207nJ`&=JS7%Spxct%z5yCk!klAnSa3Of{+>zw70*=TzdeF^pscu z!X+DstFm5E5d-75H-}w?j{v@cRuT)CQcmk1TvEOVTCO43bCmyZ_$Ep4J15>Qh!2%T z#+-)L$Un8wj)dzqQ2v+0XOGl|E8Pvf#ZqQY47I1<{sEu%N>RD>#x{n+ZW{IjL%y{R zWZ1NuQ1dBqi}3X&AbS`i%f1ko2UG{Wtc z{GVjXJ_X18N0PCVf$%M9Qa=;}_|C_Jqpu>Gs{M%ife8s6=w(0C<&G_L2pV9|n5Ghi zGMEHEhnEGQw_4Cpo_85r_3BpfII3|`2+t8)B_s$m`+h1l(C9W4n^_60rcgghSR(~h zQA{7s_OdjinNAvD#iR^G>4uC9c=|rBEO_(JV>P__ejK5rvzt`j)pffq+!-Kf$m`&u zIgeEVc#?kL^Vk%D?rK5*yKBN0lv*-uAdTiR?RyCRCtzBW?1Z`DRUV%hTw>>fwR0{KvUusWyhh^DmLagAIK& zk2RZ6*vUMm%wL=`=~NvA67h=Nd{{*%E+@Qw>S;)W9p!F_33 zzE~g9`N+j5D$b3{5Dq~Tj~jsSNO8RjhMm76K`kmWW#C5t$;@20zf6US_tVA)99tw4 z4BrHY3{IuNc4ea8(6A2%z~Q(cP%3q|i(t^YhEeciIQ}&#mDbfoadS<>C-^2D|L`?w zLT)@>eiK>X8lG*00ut)@GKS#!!=e`4l_&h52r(rwMJ!%o6T0MDO1#@}DfU-*|MQJD zs9j#4+jOXi1I}luy5zjLBwo4bw{7D80%PpEzPB9tGDFFj?hy4gS-Zobt~ zQ!E9G-#opS6i5YROlY+9U0aHta*8&s>|%Vj!&@4(m%LA7+gUq-cN`J|gkPbG|J+Gi zoZNQ*ba)_$P&jFxngdF$qaAOrkdfwWT2^+jiZ0pzMj=wSq*i$*-`vu%8Js{N8raOL z`LQiz{mx=IPTiGTfHJkSb4kguP+acv#n8lX`Q&10YYc#~cMVk;<67i!zs%oWt@_^nvRyg-p=?{#%=#4DCXUoB$ZnaAz1Y(*H5QQ@+pg7>^o9xER5Uvp(F)l; zAm-jsRtE^^b(Y*~dY7sEjL{~(*YrvB#Ik4U!WcgS ztGWXGtFIXR)mJY5)mOX=WK^d=i!UJvmk%tmvrm#cEV;j~ z4m1D{Nh#j~rua4iTrlH*3tO*CiT@?A16E*L;fg{~L5q$j6Cc0t&%DxnO~CS> zFwIvO5chxBYY8ZOP5uvi4g5o2)Aeaczr2FKtow()zEOMr^k4d#6X`E~4Yw*Lu36|4On8|O0~i>itn5)+AE{XC+Q#%OSANcfQkc*j9gGf26)8-Nr}FOXIy#AYt0FtYdm8D@fOSQ zTO}3QNE)k4sTuHKF97U`PTPUjCTzBD%HzHt7;H7lRv_EZP(wK*6~(1N{iJl#B(Hr# z{aDMPHcI~jSlsWC$KMLSDUf!7PwUHnHiWt*s4_OREcN(ldGYD7#6W0ttl3z&Mj8a zLb_$+MrF4uZ6!T=HCt<_$p5Nt&e(m7f8PbP&$Z-I$HE#t(6UnC&`bxUWQaxf(se~s>!znFs9S| zW(_-u_&%xLvmoY8{EH0rG!}GdyMLK>^yI#OT6Hm<*NMEa^_@n1w4jJxKkElpO009@ z@92WJmAV+2_%j7WIbE}Wac6+lam6i@K?U*5k{HJH3;X<3#qLx^mta>;jW{>}daUaF zOt#goEK3KiFRV9|&6uSt|xwy#G+y-%nA zzLEX5vi*S{cc^KFCAdA>pXnBSORR|%b_roV|MoB>jbT@Vo8F~P{d zHm982==M*I>MRB72I@Gwy3AR+=!}rsU=DX{BB`5_01pt8DYp9qVWzMR-5~C0%!x}#;z6xrIj zaM7KY%ujP}CZ$BW_rmqYne%R{@^u=H#^0cUsYiM-kPhp`(L=_a9cVES8de-Uq7p9S}!yM;|FYWz1pPJYdUJ4x~ z#B4K5SHXO@)m;2vnp)aF3Rh-v9$$Wu4h7r>DE0naa({haR$kDi@k#T7-Z3IHw74BI zEodk|dnt!2lF>MwM*;NFgg$^jz=rVphsXRxRDGm8FF$wIbrCIZ2f4q$HoIM2KC0+S z1%ypLKfl?3kzj?aIDHjKQX}n>)2dOz^O(-aRjD<75HsJC)!%`eleMoe$7X2fSbP^l zJBNMT;VK#sZYo4x>Q6PDCPy!)+iZgnRz4hq=$ZLm4ijBbQV}3TvDcR)PB+v_df(?R zs=~(h(NOCL+Z8US5;^BL_|N@PSc&J~4s9jgMI;3q#it+`X=3Z+Q>Qi+X?D;DWTw53 z+UJfyAWUI)es9<(I-sn$!@X9RBUb53j*Fm`?kz{>vC?P3hW0a&7+v-Y0l`-t*-=Z0fReEZJXUMskK_~4iv7`m;jtgf8!_@ZzhC(0a^1+KX-s7s}GY_BqXbYp#$M*?JL(qV~{BgWak7yNSfX(UJ zmr0|w#m(r(GcqD_8kbdB3PRk$UAzbFtrN`o6%JiTC-a?*tKNGJwbS@$yz-i2!HqHc zf@fG?N~v%R&`+Jgy2Uj|(V(`)$k^1<3@TqwTXc|cAJ9<0!L@{~U(yi^u+hNoSD_4T zc%z&e!mdot8T~UBpH0A1WR!Ypu?>fGPcVvrdjNMofUlA%C!eXH&n>6hWr8r_Pw5Lr zT*max=LB=YIj6)jvs}^97~&|JWPFMwH7Y}U!!6k`Kmm7vm5t#@x)+X+K9;@@Ex8ZR zVd#Y`nVVHnk@&pd7z9VzP5iqcw(cmHlFb zLfv*0P(M%Jcwy5<$jhT zGd_^n+P?4gxyZjcD!V?bTfnGS<(;HS^4%V^V!*-ecM_YvC8G((yy8HQdBL~|aU8GE zU?n>*myn2Amh|(Wy?QfA_mg-%sNb|ZXe~wVMr5*q;PrHnyc9Ait0^uLDKhziSk)JQ z%o||t%I)^ImF;c7<46WKnO&=Zd}M4B!Bs2X6(a0aB(r&|j!{Q1xlK-lM7YNFBge04 z4?bx>@X`AsLKRr{ep#Am+M2)y zGJA2~m}^6IhLTa+M>b)6W0L}^Ot<%-vTNW%&f`>RcQd>$pv&!W;7Y?bcSK{Y%V^cO zb7SSfeKjV->@BMVXszXPf2zNCYVY;_7UKSx+uP0#)*fB3t%%-rK_9A)Ry#7sVWyj- z$v24h%d^Cvi}f|-cgPp(k-J$BF0Vj&fe<7x*@FvI)qivexSYODa1(4xH=MWx7wQDoy`SD;b#F4takVziS1NOQ~8+=xozWdl% zFvGuiQC_bzj>a0lQ?(kJgMpk`z4&=a4Y+@Yg~7st$*cZ@JC|R#F2|oY?-V06x--KY zf&dH*Tu@A}qxUDNnx6 zWqoj)7$nY!?Mm&Xsapja^_>Z^QP4yyZGSwEE!*FtJq3#vg6x%87o4v(=UH?n*jga3 z_UauR_j0l(=JVXz03Lts(PN|4@w~Eza#rhG|JQ`;&S#TqbU6#vjrT2>>ZzinX;Ziu zf~($^=F#76S3?;~O9mL^zm#p;d(G#H_NbO7XsAsvWMoqeY&!|>vNo&HykU1Opc)UG z1B4@;?{-IaInDL;Iosw5IoFuhpG_V|%yaxSa>!VV4MuidfVpAE1mzlzX@25(JegDe z5K$6`Z(grF?q%y|P2~qseqkTwuT~0e*|DL6ecf6Vf~NK+#;>xkmT3370GnafybKqy z8viHZm)<0RQo8pEdy(Sn;2p|?B;(WztzR>)e;^)CmO316f;Sc;4YDW&-rMcLPPgW_ z5&T*3@f!0rz?FmgEZiEBW^f!Gp`}o=X}65X-eH7x4i$WZMi znHsq(UyFCVO}FL;EdEn3KC31Hc22_9+b?RDXDq6c9H#sG0&Z>hKARr*QJ7hBcwE#p z!Bk&PMoE{H<*3Q?FsotR_z-amdc`zMD`^~L6rC8IfF`ZZ`~0Tb^&rl`_;(BzuiZSa zk$YbJ$$axR5r=t;L*JkLahtz_i!$NV>vP*ltFh?Ar5toTyn1mR(DVOdAShR4)E37m zd_XpqWC+Jv&og&!49+9|?aWS_6^yK)ZvOP!^s|5Ui#5A*49TArCz*npL&}VXQ$)-x;K7;}%-Mxf*2_nA}N#8Qd0{!YBW(N#yq z`0hj1hpZS|LpmA$kC_SUZt34qyyG1$uxf+TER+_naSC@;)4tPeReur^ z-?vvydBnX#U~W!3?3|c4t+Bj1-AcylOGo0}ON(zj9o`$e0{PXN9O$AU!1?eaoSIbL zzABsAvT>YFNOa5wz1y$IP5)4~V4qwZ(_Or<~-qpsI0P zqz9mC-0|6db@~W0^bPW7*sywNVb#&ff*`6ab5pEwIJ&gTpDe4;|M0o0hH|drYCO(y z(;O#1pY`DE3a| zH+?@JV@@UDJe`3h_}NE4YWD_%l<_i0QS9?7@!`{J+g(o=n;*6d-7&C?T&UX*cU?FX z9>$~Q%t=HE#_HxRUPKAy30*bf%l?o(4tdqx>3NaLz3F=w{o#8K?nsX=W6)X6Z9Cv} zINRW>Y)iK5?^E0QqG!;mt|{nJ?DZzzcip20;)lIZWG>|Jfpz8Sa0*0ueuss;3fVN8 z`2>lOAzy(6JxjPkkk269Aj)RQbRy-VSz&`dDoIuT*rDfV?l$v5(sT?j0C!4)S}6kv z$P@OZ8H-ibh<&Zpb`LNx3`_y1cSg0G;CAYU{*<2M3icnUj+G5 z&2W4L#!J;ifhv-&s3;t;^pCic=W#Dn1xOiz8@Sk}a7RrllDt_y$`cN*&^2ITf3fH9 ztiuVHa}fMQ|DPS5orru@Mk+pJ&ak(O?D<1CY$+6!8VTb){Q2TQJJQZi-hR_6e3xIZ z^F!BQNy}0Q{=L!_?j%$3eUONxD>9R~S0Dq~1G6byu!^Ko8^R|$V;%SYV@) zqv$9E4COV9KY^-hCKT-1^+wERzBHuG-bN0j??tk(e5Z9Z5$-oLQt{XO`vHs z>fyf`fj}@6J`+mRquu7wqTT6T=yvM9$0ehse{EuUC1D}Nk^e?oHab>jI3TC@*^q5h z1{^21NfrYqOdC4*lp;B^xJ3M%7b}~Fm?-@QAVR*8kK|i5@4TPiR4C#Mg{Fe?JYUVZTbWW9P+fP0y{v+u}F| zIqAua`TIFN&l32vOMSHg=8^CFpru=|!nPA-+_qk@u-O-l%U zAU3s~Al`UKu6bO~9U+!Lcs3`O@s1=ynhP_+j#P*Ptm-IQ%gIZmSy?jsL$2LI`|WRP z0o75fr^4YQ(9u&HF}dFNv*pBPdWPn=>&wMd3a#ce+#3N=LzVfE!e}O0UtKBf?$>yD z3{R`voc;ud@yy68+#h57T}+tQA`C{>fzG3`_`|S`9j$J1ob+NrVKZ_rg+4rH&h_~F zqpGX*Ipyr^@!f{I=#7qxPC>f@6jt1Zdr%yC@%eA5X<1RJ(Fci&7x}2E>#ckxny>9l zsgZSPm|1j7ywy=kxE9n&(D1l<);mmydw`Jnx=@89tI2)(h*!1V+*}1Gg|4|jV7|2A z+G)55KHJq`&Fh4+3$u@pl(Xgm%)qlxN2}qY{|R9=C2%C_H%Y+m8ZE?miwQpNAQb%V zmzbgsX=o(4=@Qw6U*+8}_r~99%xDKO>;GaNP1hxd8-1w61_KpN@R{60=Oo;hl{7f-)li zD451wh&P~Q{U-pdv4eyDVjlY_VW7%8hKUc!*bn}VME=J#ZIH3{O6s$OXMnZKdO~hZ zV*M6iESZ!N-M)ovnZmqrYJt1ENrXA_#afz@yGg$D?Y;*; zc+wVk^{6h9{6lbX^TRWImM+!S_BobdR)CLUY!@K2Vb=ryv(VlNqW~3~iwMZ*{u7Gg zcVzaFKaxSQ+Y&AZPAxTX7eNp)iz~<$Zv+4PQo+XGEy*Av+ztGL=F`&hjLkpQmT@{IDi&E z)PpWM35_!uH_@sO+9oxSjL9OnLsJG`qFs@+?+yYT zDYse?6(iN3NP8MYde|uW^0{kv>6SAcYy3NeokXFigkmvKvPlZL_);<0A%sv((Nom# zh@sxxU+)mwrNfH6pWw^)&Wgm80acKc^E|>Rya|LgGhQjCn4(nov*_I_8S>iD>V1# zZyDTSEuhKKOv`(fl5`6~+dUrb>pRA~pV^mtBS&q>)jN>7E`16B2mHZf-6V0rgk5F^ zF%BEjc&9x)nKpA2T#^pB&@sFnO6-{lu(LT?HdVogL(^!$aRZXR>J^y{lYo(XQIlF% z&7w)<{dALjnQe$cT5{UK4m*vBys^_-ayBwt9A6a(gs9%)*P^|z0BOtrx*MTlNu8zS z(A9S_sQyfGsU_DhoJ-n*D2Y;3>^@(XU1dZ&FTaFO!EJG@lsZgwB(6SrE z6N&qNX8>R5T{sY#U>mNO9zx*tTno?tJJle#qrv)9{vCt@KkGz?jh@M5d5P#L;X}40 z<#z~^z@fy?N|>jFdH->OfBKU=NP=Y}gd`U~22Y;!64Io?&e2tPQQ7`i~8$0k>6^H-N{VGiZ zIdi58h))ShGtk=4e&(^t*LpW_|I>vGnER*@Em9)*VLLENBEHq6ShyzWj@C{h_|7W1 zo|0CgAn?xW-RZ#70(Z&BB}+81EY_>v_%m|s1H`51Sw_>aI$whCqQQ4r`-ba_e zKMZ?(!YgU~euUW1)ZAk^`oFJNIRv+ia@u?|l>a2Fl`wPi(Nu zUmAL9M&A5ps?z)Zk_i>=rl4E9C{@MNFMUPHL?18H1-n0(8#ucE@!MCpGrL)Pbcp%T zb!euhKB#0=B{QS}O+@8_l@^~tGq6UXT8vEFw?@J80TY)cp-fDA((fUOFvATnRv$qf zD}_;i<^9e&N{2@OrGe4ceZ=RkWUaCo{WpErM?pqJJ`%s|m9umi4-n;eMaIJvW$x z@kf0mu1W?TSKlvL?G>*`cdO!?Jvr#`X9w054&C6w1q~Aq-l~sT?*osw!+R}?9hiFg zw2{L<6sdU8l1eth>C+!1savVs5I##gw`rX4X0V(kC5pzPW-AsMA0^A6jp+-=&4@`- zk|{)l!uLxWrkB0ezFl1$-X5FUD{=Q>m;PtBC?g{;QjacoVqa8mu(Ut+ADkqP^gavm z^h@lL=m={g5`AO9kaa*@xM0dAZBRMhOWM(-x$Ld971Yg zQGe4;{}Ca`V9TdlP&Pr6!tGOURad2MUT&4s8ryo;ea$XV=hv!Vv$k$*#sSpnFZnO# zcFuGj>o<2jYd;5I`D=WUJ=5f@ID;Tj!e8K^K^8H=H@|=@ZwUzV1^Eq>E5v)y*pLW< z(Af^h-j&jOMbDp?67LPf8k>}>O_LH&awythLbI4%tJO^(&T#K>@p`!Nh+!ZwVdqN* z!oi{;FaiHlv(rGGq*d`%A34n_MGl3{Wio7RNo~Nu6V%+041zxuLKfBcT4`M~f(~OK_`eyzDZjgc{w#=UTxoxQ5ad+^L{xxZi2v!&%}nhlw?7&H$M0gn zTHuccGi_P3OOb@c)Kw{;$wc{RQDf2XD9BBg0;mF(WhXQzP!c|MF6ssm_Go=6fJzc% zvW$iB9dLXOg1PN_WK4%4aJRInPC%K|zoSco`S4yt8}+|cY1GM<6;u6aL-?Ct^6$6b zLP?8%Eut5!i9n~!r5R0rnoC#Z%fplr$oY6Ygd>$YDH4Hu2-{9xhoH4*dmK+GP_kIa zUft6EFJ>vR?a&9NRZwPp0y>@^Odp4gZx^eEOKWI9K@~a)6*4T9Y_9?@(aSK&UN^Ci zp^`G6L{Y;eO@zKuNaxSm?kl@|HOR|lH-DQjb$p`@;NEP7U4h8BFNBpOC5LcsniR=2 z=rCY0#^(BH^4ZC?IdLY3ms;xrnr@Di4`+XCD zMET1Isb2JyWVDdRC9N%#knrXRIzp(dmXAT|AXd@UAO-4**rEMa^#Rct_d&yaDzEcF z<6G2g$c_}`Ka&^%T<15H*B#g|3(v=lZO6$cnW2f0j}LrscP7_jAN#B~+Qq9s$K(JX z9H{P?UXrzl*ewAIL3pX#f7l;P{_0hSIaiQ1!7C@`vH)!oZ|?(2wfPGBf_I_OE#Vgr zlxUPa(i;fbGyajFdSzFhzc;bqI|m1Y52Fbqxs3pAZzN{GIfP%Y;ne@LVJlEGpBFlt zJc@Au_{ls;01kwDvrjddSDOJB$M~@5&aAm19`sDE3g)e|K13WV2RKvAr^2I4xJ!*V zT#NQVgMp2^5<*InYA>aOR+tYHg4cOg+hz4TV*u_-X&b+N$(gWpf3Ey>LyEQ*zayw{ zWwrAA9{=*3gGtWk61&lChmV`8xkU8eCWQbo$9V?wlxe~^>0B&+G*$J6+4a^yI}DVn z+I)wCnANA)wuiciR6iI2|n1;0!C6fxnf6cPH)W^VVJNTP(D_=!tTO<6yM>L*%>h3JMxyF4_sz;tBA>faYU(?eIukAK6q(!jL za|0xr@{x}KE-0t(mlKEiQ|;4PxI5s}K$|UM(xSUj68aeLRPEHsRFhL>>SxyS!Xur1 ztt^=wNaWW%qNLVFPO+;X+KxAX6dQ%oPJt5!yMn}2Ga!Q>uY|VB{n1o%LUw5c$A@i& zVG$Z&Y-kocXNo_`jL1WTagCE51OHU`u8^#_>XYdK1-5)-F(n!?g9V|^Gd1w9$!R<< zFZEn3(z6pOE=92dG;R>a-0`IHxc1wQ9g~zEu{JZs%EE1uiaBzqivu93GC(7KZSnJj zfU+iZA%6j@AR+$jtp`UJlM$Z<%1$@6~7E!|^d?VeStpc)F>hzRL0ZS}klV z+WR)C!U9QJvIbV|WSG&5PF7l{^FR_?_rlgrFnH|kn=!w0rMJQD)v@{-kLg|hrz_(3 z;IU};&7;P5uI%i_8Ul!T3g|9b$YDD7k~}nIX~M>loN!teJe6-q7(!a3h7jI(ZagG3 z@<5GMlr%Bf4_N60K^dQ}^XP#Fjc6aSise}SE~NbcTF0YCnx zD7vL#&|%pSek30JNZdXmx#tp9lpQS4`ax6~L?gZRjt84sGW5Y!kv9wYOP`KvbJt8P zhV+K|7fo=!!o+t|9XV8q3F!?Z=U0a(N>=5d14X63Eq_m=w)*7lI+!TP_Q$M;`j5zl z*%Wn>2wlDm+(?WAsh zyo`WPALn_^N@k(dDu7gCN=bVI+?Y-8xh1?}D(R zdAciWorA0zj~Qv`7pVBkwUG5Solwy3KAdObt7tC-d+NiNm+v=sW{;(HqZT$zz~=|F z^v<^^^anW80?7dWo;GUeKz#yTSPP#=Y_mXe5m!bvrL(Ar($hM)OnBh;_Y`YS4v`E! zG2zXqp%c2rDT=HIHu+pSlO+(&ea!(a2oRtwJP%64|hDJ?acU~=hl zk;&5HyowFx%USb;DmZ&wEVe`_uvRA6C25C-o6PkC{11W3fF_T9sRya=8vz>^eyz8a zUy3quc*ynklUEsq4-e+*Y?9kU=~ne4ll`78sjt;*lW@m2cc=*VdNCg(( zIf{ii`g^vuT@a4`f$|y7r<7Ohs$2FwMZ_K{_(_?-E*}!}b$!$v1p|d;)1{sbV#g(f2|Ein|!HO3cXFZo^0=AWv zTEGkv0&LzKn;L%|dLRG~#(40WxI9my7dzj3T?w^n*TlGCpumZj{9}gv0j)mZCX;W2qkYPmCVIDHmXWefLRHdH#Y}ia#F;Ni3b@HH*Y4_B>{NQYt@&hNGL~UqYgw<@*K67*~cyid5Ls_0=dU0mUJ1_WM*SkO8V?c8G(dM+*X2&IR-ty>~j9?g*dW?|% zym<`Hs@dE)P3vC1UKicUe(F*Qe&*lk+8zbAKP_cL%yd8KK?xKJK6O5d( z-9L^JU#3^{vxh23*t_6Evqi*c>&ZV}p`pIA6%(gbSA<*VE>{*HzaaAC|9Sv}e(yZ1 zKKZfP3dul{*s46=?LJDgwGsK9tF5~F=qML2o&tl80tr#S8b?H1Q<9v>s|XF6i0sW7 zA$~Gr+B+C>=f~ywU7+IF12y?yd84rnw2ssfhxh52-%<2h#qvCV`NQUW!mx>z#v#tv zgDXg?KR(JPi1}!6?g`ifdt5rc?gK(V?a#}FmirYWP}t*n-j}115tDU)C?Xbpp1t<> zW}(~Ty#t$h&;EY6F)XNzcxfJM3CDfD>QtKwAF53i0buoQmx zn9Bk}`63MHmOhLvlMA0^(>|lI_U&wYn}-7LuRp%Owts7u(vutdI&<>RdZyDEMfX7~ zP^H3t1N7TXd`?4yWkk-hC2+_dVYOw=)~HC3@c1eg`6)jv5dL-Ffp60*TTsB`-7-pC zW4qlYbnSA+q-B~~kE>^i(@K1*k)L$ed?L!*QJBKNXn#Ive3g#c&RJoQEFe~-z6mPY z{xJy0x;Ue`0F(W~GwAmh=RNPg=i<7Sd#{}xmYsR#xt~uB zZHqzqT2Oj@$ic^Z1W{^eBn(uM%EaIA{_^pSSh0@5yQgOHozPU2Je7=qLCN6#M<4ct z1AZ~A*X$#KInQ7r4EQAP8E!Ku%{~0gPX0yUK=AV>HdYkAJd?7SNTXy_a9!bh?S-=V zg;K!>;+nu^$;p}C#d9^>YQ~}llG+L&Ils;aYGSrcc$;C?W*DjXGBjQab-ME>S?Q!_R3b+X&ulKNEdKWKUu9 zI&4+pIP!BZDMNJ)G2vNWKtYfD2=%~S58sfEku%N{vFNsz4FjXxgi7Bjo;X~YYy zH1`{U)2UTXPqR|0Oov#CohwtS)Z1D5qcn%d5@SZ^YgH7fvMyOW>NQLYl=y=c|!W1 z0$5zlZj%WgP1^LgD{Eo3U#x7S**wO(t4A$<?Z)dpt*(3prYmD95pfT%m@u&F$? zgh|D`pQ9)QDT>sdV=oQH9L_l@$Q}u3fk3!kncoUYM&ODfIt|6FWzJmN_bLz5*2O0@ zc6yavkI3A2&6oPnn$mCnShqBA#63rKDf|rgq5a*aO;UFxXkrzPkZnGPtyZT?wF4WbPX8_8(r zi&?L^y`NhD_|>d_U14FEaKrur^*IN(aq>1fuTWA_ni5Pg=MmBEu)H}C-k!xAQc+M; zSj77N7713s^VD(D*g^f%X8pfFXKDZESWeNhvQqofn@-JdB}<0)N6O@Q3z2mf^T4e4 z=t<%*sZ|^0#_ejrF}vM}J)e*vMI zu~hUAhx;P_Q`)nVDm zmY!kgL-@}O-0D5s`a-@!#)ZZFFMS75&C1WT1#oGe#dg-7Hm(E-kbX&Fc6X9 z8?40xXi`afq)%DVjMp+yAN%YOHjQIyeqjjN!gXE=@w535&@yt@#ro5i4N1vr4QaB? z*<(od_eWJ!+Onm>DMEld#Y)9OU%SELAj0mj5VCMgTjaPY!ghz~Om3BW=EAC@|9mL3 z2~9AriVT1e)i4U>cZ?ikID{xObRoRcnt(1%AGh|jhSUI5f?o7XH{rh>py`r(0UEWW zW-!j%w2D}wMw1XmG1ZS^A1S5MNn_oi&-+*l{*ca#jOeLLTD`>gQ`yXEd71I3(L|Jb z)73A|?Ju$WpVZ0}m6Qr^d(570ZYOGdM>We7jmP#A%KaDif(E~4R0Qth%cTggGk1L0 zVB}N2_u=wo@QVai-Y5%;mo_G)l-CkCqZsn{bk`1*-5nNPZP}>4dCSYx94gFl**0ay zMhVKDkqLis%!}gpq^MR~IM@Af4s!=fTldqw^yAO7?1sZcAJ3R|BMFY0YJoFl!0YgFe@z-2wxu$T6QD zc33FrqsC$&N5eo7>_1?p5}b(>w;ezOao|h`>Ft1{G0_;ZMzh&;Wue}Mi7$JC#AfvU zty{c`r9-H}68~F|h>1pwtx6mJ5+ma_u*-rf^k3cK*ey)d)PFUHXh@t3E7&3Ira8na>o>HZj;Tpy-~5`cz+i(;LE zqN?+lLx$I(_%xJ~5cf?Uq+h*OYvd4hYjWVb0iX)PG84ho7higg+kxOQ-qwl7VvPq@6yf0!m40{tZq#Rhh>sAw z{Q!O<>TvZ8t`Vy#d0!G9?R|2Mia2p{5YI?QmhNJmjJDMx0{pKQccMf6m)RpRYk?tH z+!+Hg!rn$jYWUyflVO#Cl@i*M#*2JVv;^o7*D9gE&lHa&7LdHBm1L{D62dT)UPWJw zE2C99S7U<(GGeBYe`3cfpf=uVr~4c*AE|76|_B6(tAMorw57M9Tegzj^_W z{=Ul)h+z0Iw8-ip@`d+|hgUzk&%f?S){hanxyW)Fdyx;c#bCgBz78=XFRVNR)zuGS zYJ!Xk_D>FA|Df-W3on>BkCQ%1!g4NFsh@k|87?OgYZV;_*o& zNdW*|B4?EkGB49!e$V*jmG<8Kt<##<)eF3s@4F}AB+Nmxa%i~n_?c~5GoJJ|%+}U* zkLn0~@gm1`^fHjC>c%#KSLX^L)|fPU)-fm)yfqRmg}m1CB)Zg0?`}E3^$`);c-v9( z?<~hlqGBcRcyEq+tpp2n(0OiTu%UlJNYY0f7GQUw#AwB1&L^!)W30 ze77>_0CkQbPx_4cQ8diI2XiF@lj7!B>t+0NtWWeZ4xtmI023F586^WHpvw@CH;veO zvPR-&eE%8gSZ|S^T1c!#zQNM$0{r6J!5Use$lIycC&CU_($^Zqf|3}!DqF+*ct@l4 zwSJQRS9NuqJt~V6XPB3pKGiDhmmyVpak~$Xs$)gv7{&Fcqc#6isvcN84uQFs|foXR1&_>%@-Cbd%|%mnYRhGFzOx zDvQd6Z8hS4*SXR|>6t+<|k8>R`im5Y-NNAEfUtsnEcg7CQi35ww4?TNp@Jt{U-`o&a}^YaTj6 zYn7UK6%1&?(Y)q~!?q@^{lfwf9l!*vfv$U~yIE&UOMeC}dCQp|-e+u$K-4ZuRL>rR?n2An*sue|`hyOI!Ai;2qaK)KKG_=WNi3WGV6*tgD^T zwn}HAIL^~E5YX6oF30>v8P?RMI>;mFFw8u5shZuss;Q4C#rrrBFhqe@WVy@8x0oT> z9N>9xmD<#gE{$?~LF47+SNQHmtdCCL;#WLbuex7+@8~k9XQkgAS&RbNHorcf??G_B z*I88`TTPu1<-lmOJ42s??*9Y=5s5zwUM@FJpy+254 zqpX+N%Z!ogMW_o!@b? zVRH3jKTXNi6t&(bA8Ax^1$W?+uykX-k@pE-^Cf4);q9t2DOUjc@y_g1qlxc7VN<@% zqoB87Q%8B6AY+r1Vh(kF6Ti4hR;2x3zM!L!RaQ%vn}pCn6G<=sm-P8;XYzpxSdV%c z%PAYj9zWmXFTo#pOHUs}lI=&&g(t7b-}az$VnZkOgN}mJqE@T#y-g!J%z3u65^lgJ zsOR}togT^aP|+^nYL-p<>2iw{&W_Ukr)NGvqy+L#R3C;adOBa1OYoj+nn%z)DijiP z*T=+7Q2E~RypYV{KJ%*=IME*bh%}ak1$HQxL$_sL1YduZW1&MH`41SC)(}1-@ALzofG&CWJP_Y0x5M zX@K^haOY!Qg~+M)uh1|DMVd~SGyfKMnZYBhrR!>z z<9F2$!>Py4OConvRA0NyKmMICs6F9=OQGHIa*tFqBd_FhwAQD2%U{oJx+2Y1{YZ;) z7hFC;G=?@OfcVkapgZlUW9Xyq)u2}12my#1IzNy0>mhhC^_a96Ce9{4CFUQ~=B?Z6 zHhk&Ta&^rAjhF35@lVX>V&@fM5Y1q1@sU$1GmBK$$@{Kbw9#!x=oB$r0rB61z6St( zb2_*ZL?Qo24~ggi2mNC#Ennp4jb;~aa-*OCs3`V)`eG9`rVfQKb{K0yzXGP zI}!$Tk5rEmWures$$Md?;%Pf@#)K-6oFo>NMn#5paB(vBW%FdG9P!Ao0kWk{UY!WIse?4+jd(c;CWjj5>gMteD*IR!7 zlFi#f(~Qf7k=9Uh1+=4}p<~~sy(zq7h!aQgno7Cr(hv!{nuC$0db=~)gI?gP>$w;_-sh&xoqGIl#f;t1mR_k#`#9IK?84&kA4+;CqECFu3 zJO?ag)&Sz!NklqFguJ_c%=x)SX};nYD4WO+ZoL(`!gO!0CfRp$*MwS(c7WVr)KU8v z2(POKs0Zu{Uw&(NdXUEzpM7M0xU;ki?B{P0Qf1>W=qe5NCE^Q9cNe_#fJlS4KsA}$ zfujw9*29d8H&78N8_OnBS-BczAhgaKatV}ajVA3t7u)H}=GR49mMHoNVgSMwvq ze;i8rk@P2W0yl($>-j%~0^Yv}g?AnhpB^}h(RT1f7r~hMJ98n-nJpdd* z&HDHMS`MOtiS|g>7uTav+i|w>=>{Gh1$^f-tDym?w0BZbmHuH5B>%US;a~Z{F89Az zgdUj4u$chbjM1drLQ8kl8({z{xFd)ZtjgJ#&v{o{uzswl277P@ZDOWpB%YgSg#zgd zpw1#~C4E!F*1uN^m|+>Zjg6kfT5!n&`Jqw%cK!mW(DvG}akeLzyF|&A_N4-}#J?4X znO_FuoB;n`3|P@#9S_~*&-kx(Vg2l`yYDrs+1Oe&-s3y5ux8oVYrEHcWPP?1qN2Ra zOI8<6`R#tUmc`y3rN>5M zPp`B-&vfIbZZBG{6>=FDjm2RBQy-Z+cbz%Sd(!L`t+YIkBi`7>4bnc(?G4~fgRr2` zhx4pfxh2fQQv|N3ivq&I0OdvG*%0onIzh`1EG+AAMnmg@{-N!PSP?~v) ztd%b}o4pp1-~WB{>eZQ$Wb(UimASFD$;@}64^8zUeay6~_j!oldR9YqY36iNw?Lx3 z9o`3G;)74Q4TV5D!wJ6KZc_tGkp8`u$ogPXG7}b?Jx@DNlY4Q|A@z035?@h<3JxcR znB%{a5+q@K)#^3Z;`|!BO|_78+eHJ!?KU6E^+1mYIp#XcEPCY_q(=(>}j7w*5P7(maL>y$3 zqenyX|Acc=$ZXc|gLbazicV$+CoU3Wk9QTFqW3~s*V0o<@# zmZD-B*b|z23Gq}kE4p!^@$=A$OYEsKm|4lxcP$?N&f@7{oJ>U|s`Ip&h8a^tUS49h zhRh>NOQsiA35nuA2l65r{1`kpZz=tVX$%uhVlMbsT<;XUDt#(vsp2@oXKvI zb-WzEJeq{1Zo`TqVNYR6J$YfqA`^B^p6hQr7JgOE-fLvX72P4Z$q9HnTuGwUDoxKV zWs38$L(O1wZl#H4S7fhZ&b$3xb=wn3R5=EJ+Uvg8j`RADLB#0ME-*=Kb*Ig**UPhy?#%pxCfxH=d69$noOPNMo zneF?W93|bNFg0@V?pXb3f{klf@8jV1SY*{-j&Jqa74gG9mi)$TDW6MLo+VJ_1XQ+qo3Hb+oik zvO5~YIqy;+s%hs_GqY@MwUGcDMs~p2tLG>6kGNd=1(&i84%yrnl#iopyL5>FAzS)db&r`r=YnL3g5(y!HiFkUg$Y3Q>vzegWckB z`ht7~)^j=2Gc4Re)9m?-m;+D(6)X?wt|njsO0hKb9|i_04ed!VbMF3*`Vf?FrasC}EAxgw+eEgIg; zLTAG+>3{}Bv{sm{c0CM*02dHpKFDZ)cWX(q_xN*cexDB-5rxyEH&)gjD?=0*HPu!- zvhht+FgFFxfytSKiDtVo%kKvnC|RO9PcX%J>BVBAKz1@qWf(sB^TEzz+~a3%Ps&T- z8+c*gQEb+?-xD{j!5C z|0{-u{T|cZFiltTZ^d3Xi#+Tjx_)ZYU)KyStkyPnOUu(@Xv&4Q-4D}1` zEJpaEBZ(ev^7)C7%Vh$b=1=B#Mhw~?9ib9nN+$IP|CbQGu+>x5@6gZ2>><1YR=;0i zgNA50`*QBYp(H{x`Sb``n!Bk;I{6qX)?Tv8kiejd-!CFG;G+uZWl5Y_wUJ?kP1INJ zE&4@BLsP*1!f;i8<{A3Ej)E{>s3Crm47~zCFL5UtuI8qs5D8%j2=CDE|IhCCT57RU zfC;NcNP_6{9}&$z8k)NWv>!v?!%w(Y3xs~07JcyzhM7OnG{l3xx#kmjx9nV<@Kr{3 zv!(?P$h9rOZ8j#`8nhxQsiBQZ(JKrq*P%&g1H^TU#hSG)Pu$)|VEqcv#t6g->v<^Br~)~?;uiHzR#)PFD!gF6>l4spkH_>BtWv7yl7v~z`J?4pR#^4 z&=@7W|D&pjl1V9$b)`0w$+sSfRzAu^CGuitB5E+N_MOO%7SZ;`GDssPuSx)sgY!qZ zG^rmV`{SJiH)zH&1-ETefPb3c>94x2z`k+6l?PSDac5|?H(=-02p`mg@`iLYg%G4Q zo^>9Cmit;lEDPxIZ*Z$2Ee$Bj3~q9OUbJ8@-*GzSf5Ts&FJOsOyRXiVVw>NP*RF>q z#c^Sz6z_TZs}yPC_vnx}8ssSR!(0iS!mT zj~HKSnj9BxBDIQwS?g7BHUnA|WT%iStJXf|zSkp?MZW&EY%f)U=Y`3_L~#F= z=0O5qQX$L@_xV-YQ%z=DfxZOF2i{*}?>?!bsPOU}qCVx;?m7{_GNp0;0w7CcuL8nO zoJ!}g3~~UwSh03`2y~}RR%DNYg(Q&Ty9Il7VTak<5Xe6wfuwLLitJUnqP|Zmd*aTp zLptcaBzsH-(Zh&+K0J3fBpU^(NfK^_r#`U^?#B*Y#|w{H`S>DKb{R7=5&Z`rg!)9`@!Qx!f#s5o5xStD0vLh#h5=Q7Gj8V)R)=_n_%){DzvX&bmoSPwS&ECn4xMuvc5-Af*N-_K`Lv0E8@(WX56H#jRUMA1N;?4VG zGGT6iPxF<wxoc~%9y6eyqk*SLJC7|C9Jd+|Pg2+FKK$O2MAn;E$Bpby2 zhpr+2qyL8Jns-kuMeYvm$(h}-IS@iTtYFp^4WY$PAKf7QXebmO4g;R*8HPmN{~-K< zNJ{K0p0nkILkw}B#}N=A=M2%4O>ip{BTnn2%{o8Wzuc%dT5m5L1#8Hb0UXJqAbEZw z7N_5^4xaIWi3C#uZ;4(;(h@m+Sa4V#N~M{8@L|ul_PO=DWY#i@pKGtFKlmk~wY@iW z!dLP$zH0{k@=AYZzq6Yu*y++C$y9bWRAaw%<3&w!eURU=NHxT3BVhnX1WK6^&;Wo$ zCrHPQ#1F(pk$w#qMY|86er&vG#$d%DT)DW$V7)~ccHO{ftQc1`|8gTEkTt*YyjR}<&GMau~-X|u6{GvDS{9j$D z!_v5>XzHJ2Gy71w7g+$+Uv}zfQJ*whigN!S7piHIPY{kQulk|cYqWden)6v}kQucw zfg3WRc4bgy$@w%9d{djs#;B25HnSms-D7GHsrWcc_}o}f z(+I31??G163sxgVL?GD^wOAgKmR1vp=)Ccv9-?ZSZV{k$VTq8c0JIpN2s|kjfLC~; znq?^>Pq-76Ra6wIOUhOYoAP=q;seLYyU&b}^)$m=&csn%R#!a%m?hAQL!SF{ zXX?cXK27eWC#VyJN{(H*f;bC^X)Cgr9!Yy|s|!(YiO?2;AFAb#O(b?K_>X0PGJCkH zpZiZ;V?1NAP7mJ4XR2LQzFv*K`?{p>REH6-5CsJvD>bVJn90=!hYK`rR=URQ zs95sk<9=OIu>{M<(Rrtuv+CBJ2#IP|m8AIX*~6C%z-kDJVs23;;A8JUFB6KNG`+hg zE2mn;fHk}*1kJ#(xhXc?U`snA<-8~hwseMb)!va^LE!pae=V#&b^Lm5u=#EiW8(*k zI4JX`?=-*CS>ZKW4f~I<@YN|h-C$CdUYzkN%DWZI?&tOt&1AN^Pm!hmGQ~k|UV_j! zqnnc0FH7x%{pJaQ!BEt7Q*P#~sRo<@%sV|qTzs^nz=gG`xv6``bJ{<0h4^Or3})cP zx2NMJKE1G74+&{ntJ)p3=*cn4f2^Np21u8zSJUfJ*XLtLgwMx~$O!NEtay#5@eDjy z4Zy&ZRSno_L|ZM;gV>`_Hmk>7QKGaIpZ`XO{BhQ2py1$s&Ojk&!t6O=dagsh<~+#O zc*KdGg(|2;)>m}ty9#V@5e8tO%HBNmVBkqm3uVnvxc>JvtP{EY&U;BGdU0mjbj~=s z*yf$C;)`S+#qeR<+0T&qK5rORvF2>0V>p}1(lTG8ny5{M$EVjXoAw#LvUqk86mN+#<^5w_r`vDO8{fY7VS>Dx7JQVJ@wl)Yw=QN?Mo-Ka+JwYAY z9h_zMY@qV-sb@j0ST+@};heL|J#w!8QpD)+8(Z&@=ak^&SjcAY*l<9A*#n@DovdLU zRbVgTbBBDE!0Vn-t-T|{BnP{7MYX}LpvzPz44v?~YI1jRdRvpNGzpviPdKuIp-=qc zw{;-dqqmWFt%3Jx{LwBXd0p@ZEjzssBaP=dulEC?K(Ly|O#>sg7H>W8>$0P@=ztnC zQY&IdD7;xDBIt~#Xs|bp0HDyu!Eo%m!Ywv%dXrG-kBsk2o^>G6Vk7Ow91HQ~YEIYB2qQ&V)_-7~(XStcNMs%XbuT5=X5hN@Oesm<|NC`)StqqnZb3;98(N zK0;fwuLN(iCjPYZ)`r~{sSb)Q0|PEfh;)pJQXC05K(lxu&X-23(GSA@RhWzd(C8J@^L!$cQG%$e;K0 zT3r;TdbwTC{ptG9->ECNftbnLhX?Vi=y93rx9}nwqD+|+C0gT za9~>^MkfWS$l#YDU_cPUmA1-5O}(se@Wqh=g=c{8EFexXAlpjkIJqtH*;MuG9vQ*()4;zXATZ+>kMa8#A z9>p!cgv`Zp)Tv|&-TUx-&s2InT;DJI;K^IZ{oT>lYkmT5K)3YOeniA|&~wrFe!H}l zCCGG30yUSc}Rpjbs0u4+OE5~T85`GNq^s-oPdCuH9W{TwM)~Kc#9KyQ9 zY7^Vp)Ja|pE}bx*|<4ukLKXREnIyGaB+^@zi81 zws`HWMdzpdK;JoXea^=Sv1wql;^J)o$aj~!at&oi&~?YwVmH0T!Tq=Li?`7id9AFc zB!2$E%Ucds2*#ktcW1X4DS4;e9V{9%zmJ$onBDzF5pp_J<}^kZm*?=q@!7cY?Hq39 zlc)H1KiJNd+05@Nb3r&|YvLze!TYVeh2S6yBe0DsM)uCfwe`iOnCE1 zyv-GOd~SVrQboHa`L0(DZVmaaJ($aHrBJ>X+(=Gk&U$K8vq46VFsgCovT>jZcX%>8 ztgU%@BzL(CJ8c-8|MZk*>{U*AD&9uwhx-2dwD|I}^VifG`_ewQ_^(obw|{#siN)Xk zLX)6xKGOiWQNu&l!=p*I(^!4)dhMCHolT%;8UMx8TlzzR55v$S>_1Z#RC$$ET{gOI z+OF+3Jun@^@;+@Y6(;D@p^n`*G>rhShZjCMPP{aL)}PIsbkRSHW=l8Vi>VLT z{z|3&z_T>h71Ps0!3}ul)(r0PqBzgbE~Sl4s*S7atrfhz^!m8?ex0`BR?n}%>G)`0 ztraonbCKV<<{xLAG@!uG!D-|@O2@1e`PIa!?+tmoO~}w6tn)1X@j)BHT=U0#ha28v zcSF5Y!R%77miF7sBv{ems&p!jAEFAryP_EbGmu!P;su~2f?x|!1?~Lw1X^3@bZMSk znGW+R+k9#AsgV*s={`t_K{o%lxdKG5ZZ6~yIEPtY-=yXW3+;GzALyLOyp zBT2DF#jdr+x=yCz{Eab62Ew+$m6`N-X1^=;Q`%~yYU9vIj2(U)U36gZN-obHTm z+#bvvetWm83zBH;o@V>0^Oi7bY;VvTJGfeX8V&kfPhN0vTJfFVmKYb%o3N}>h;v}K zeH5+Xa9`dVhhsB*Y}tO+plZikX4bo>#r4O%EwA2^4JsFi&HFGiG4{NlW6?o)0kdT) zKj>>>r26P4_c~+}*rl$K3GXyD(!tXmSZl9);ErKdHQhEg+5O`y?7jUMb;{yhq z5eZWKQM_vxsbeLMO0SoaQi{nXemQ zUj>&bL6>aVRj-)~r@W^gw3m~mJ)GfPFS=jKBA-7%cNfC#{fH{F7Q`NcGzn<(L<*PO1m*$!H8cDk zAn&Rpg8awD#ggW$>x;;EXAO`>ZJDqG;En*h)?B;{=E6bzM*NqCRiw8y`nkPMKUJCo zJ!7N1P!OpQ3?R2uzcfTk8!m0hq~ zo(o+#JU(<+6FO53RVbWFTgu7gp7C;Lp>OF`&7c+6= zgbQ20Kc{$fON9Pjy^5^QY_H>(j^gF!!;PK!k@eS`r=90c)HPKxc4__cR&nyE^<*K( zHJbKjHm8@DUI6w(J31t+I*Q4H4vmX;PRsM(QHZ^3{yo{a@-pE_DDi|-XalA_ zX&kF#9OEQ@&Td+p^z-9uq4Ot5r)XR;S|n-bjiNKk^CL)y{BS|D4CZu#GJK~oU1XTy zYSp!@vPx;08Qd?_*mloaVX*>5-&uKDH~LYj?oKV^(anl{Wu0;jMepa2=M1 zz(_@_-6gGoT7>gtsc5Nw&>TNRc7dc23fJ#FMy4VvzH_?s0DE)0LaPSj^8kjn+78z|#y{nfNQ!_NazFYKcEYRo7#ksu)x?O%e!?Oh*dPI*AH}>^$Bpgbpr-;1&w4LgL5uk<}v#bjr8G- zIRhAvq}6g>Fbp`r4wWAr*Wo$YJf57HTe?SK`r{S@FZ4rS5j#ssmRjwR3ghov6uDXV zHad@cT|L`8ttWO1kQ?U>A8ipNc)gpaK#2D27P4v=Cwv*-fF*^3so~AdkeIe{~{#ZA#`?z12bIW zV*eOpIVc))zuMxjg+mE}rzL#msg?E)l@5#<4)Dn51ALo+LR60wd~xMM-07va$$|u!mz%0&Pkebd!zCNPff774{XpxdR>A}`%1|xbw8zlomT^$i2{5v z>lPY2K}tmy3i0$TVf-;2pKDTu3u88Tos;em-JwNEGN09seND7~J@wO6IE+Zx-O*Gq zQJ@ZZ=vC;w2t=txkLAOI^kLJ^74GkHWJBMIF+2*m_0#KTb$NYj!#9eveP5&+7zWM* z=Py7+{58z44soVZ2YS0+ua|%8jbB+OWE7bWu6U*uPta|KgR^A6REX0iBHk+)H%OXa_m z`kBiXIb^hRXvPK4;gL1Atf&hq>{!jvW3)?*@n7X%s{y29CC|M=xRT%=!dl*xa5=v4s2OpMA6}e(XLItn!4A<3tvC zTGZK<~7&Y|x0^s4vFA2Wz!yTA7N%(~idcDsqAWUagTb=M;W zF{Am7@S`t8GJ%m{N_y_p*-F#Pni*?xKzD5QfORrr=%kO5f-_sg8cs90ARsCx{Pm}B ztY6CJnfh-D*FKE#7aUlipPpQ0@txSwo<{=n$Q9W2e%se$C~{tinICBM+78pX+V_ne z&>2w-u*LUei2C}1J-z>sE~Is==5*n4X1=pIruX>aFTK*Q*UJ-3`zPtwKLF!vV0hPV z(p?PUd>v~Q8=9fxIPVEg45mAYf`dPq_}x>d&K+R4llJ$?4aRtaXuD;bIzwh4DiGnOZi zS?2r15v8eoOspJSLUO5RMXAUGn#4Mzd!5plsZ!&Bfls#orbMnZV|`2kGsVe52L``n zn{P9C1w$u492iAx16bsleG%C#4_Un|q_N$7?%h*-zUaMItIxkcz|b8A%ph07W&t?n zyPe^vJ6>J3TKyW`@=sSoH?@j2SSYLOBCAX$>+FJ^3)b)B|FA#pA-@ZZ`z~ivu#%{E zKI8b{S&*esfQ+n;gCkvb6S?CdnF0bo{8uPix#Lb-#_aMnH2}^x33l*!JX_<9kCtpb6u2~ z2TmvA$jeerqiO#&SUr&L=Xah(FD>E|7>jo|WzMm6W|LUlxbd|n!uQ*YW1*`@eJp9M zg};^^H{$a+VOfp+Y_1An3djAfOIvu|4_*@vqc$#))f`G#bfwr=c^ZQJu{KVLEzpWf$y>WFdoDOIHT;|kPhxipK5!!mG z1|AdOFD{u@%mne5`P;KUj(FTS=W>e9-MII@y=OPFnC5+Ntua!du{XsexzO(}=~7hk z<-#}lFgUW|3OTJ0%%x;e3&=icM9!9a7~`AwCQn|Mw~T;W_4=@uu6xQ6bH82&rSw3OS(k+KIt1Hzk(wwPV>HI z*Ts|Q$}-jWocs>^elGe)^*6t9E)&FQPLZO=XllX1c_eSKZsDAo_o|9_@ZnOz@yryX zH_m%Wxh99;XrlX!^%Z&%XZq?#gl4bl&)(0Z*!ad6iwFp2q6KCtQ`;0~b-4t*H8X9q zXihcE3o8r(LNw&*i(b`xsD5Tp7?AHWa;=_dT8`7=&8C~(<1kJ!N=klS?b^?F9G|bV zUT(19m)Rk~ILpwgGG~Eh7hEeJ#`FXwGjZzoDyp=SOBb7c#uMhw1P>9XTIx>YL8@Nyfk5IFEbCO(p}w{3BvtGU$7f;kWz0HmzUf16V`ngk zwyg&Thh@SHx~vV=nD?I66s${zHJQ5X-QjSY_gy&~Rco8Lc{%nd+BUV{Fqov)pp!Gy zu~G(bl*~5S>ge~)+osEWUKW9-A+NlZDiwxsGbj`ud`GGwkJhtr@K%tAe&Uk)fZjY| zpG~{Qes;zM;?gbsV^Q*MYR~@>}Ajm9T)6R3d7s#)CWsig(6&XsuYT)4ZgYe3mAf zc8Qff?#qIUBBx+)YWuA*FmiJF6dc!UEC4yTz_2SY3kf=wfL0En2FrvyD|vFCZS1C` z>z*0RF!ZtYT@y5aZDU^N48069MP?-czfnNkL*JhxYkaA1Dso9ruY0pcDw}Oz0@*!` z{*$@%k^8+PUz8QiQX5*b?Aw@UIs4ASsu0bU_UWvbN1O>NRxBh6YK1hYlTWyn%=Kj% z1~Je~LN2B%meN{G=wS7R>M=W{jMvY5{ne^~$+#WZ6HI>RM*-+PJNG*;<=VZc9$MeO z?s(R!MB~2OzGC`vyW_~AUgi$g9l&QdOBOU@AK{cg3X6hgF@P5_tH#q637RoFuXjO+ zy)gckoZaIR?pAUtRmMxi?@(XRz{$E77J8kvjC3q*NU!8jpyYjyvRw9nf(3Vb6y@on zi-AvSyX$txDO%e@BHZSK7bKmh&t3e~42+2`X|%IdFsWC0ZeH2A?qxv z0&e!H1q;09U+#>3+oL#a$tr3sDB>*I3M;zuDJw!|vW?>XCf56yzeaL;eC~{Zmn6YH z3<*8GL$#r}#ccaK(&7$6aq@UK;`QUHdJ^{vWpUMkrgW}w3V<641D*&$?V)H=RK=G6B_c4KM#73G4=IQJ{vI#)w zAU2Q{r_=i$3)jEXjaxC+&L)9b;Ib6S1UqqpBX6$3+g9lgEvIu6`sI#@)k(yIwta9z zp}yR3*88$vINiVDbk0tHA8B*F;^AoQ61GQ&|E#8AL*-p$Y+?I~6!^dUy;QmE$P#kG|!h$^cUijUvB zLl|Jg?IX8sQoL&VW6mxfrBgAvAbek~`mL6Qwbqflx8^4&&K4}GqH{f$p$W}42hru+ z2*L7|$byCK!jP-qo?U4|!B8$L@6*_-;)u)*U|x$OW<^i#pdmhg>s`vx@|Ox7BLgab z<7k%aC;iRB`F*RJrca#uBs*!;_%%~0V1BBnF?Sj-pYpn$c&xr^Gqfe|7?>oI$}D{S zL``Xr&m{m_ek@uz1GJMF$zzIh{c8n93{F)~Y9o_l!sJapEuT5-V^Bw7Ju5EKZ#Ga_ z0tlngy?V^=;Ux|%(`wcb^pdaD9p#+nq|OabYa@;LV{^u`LjqeIJx#k$);2$^KOQtR zk{snBj3!cYRF2G^-UMrXPlRF>!woi*T2XWREKqp#4o3;QxQP`l_Hjx?o!*Sa5d_L4v!xYk=VHuEA|^Cy)Ta zonXP;o#5{75+u08H;4b;s#~Y-%YK-e+BLJQr>9r<>Ryi%0Ibq|`3iR#IA-(~SXhb# z;;B`=20T|7tv&4wR2Y5axe};X|KX6b6Jf5sM+L2rlRfoC-c)f1vmwgLs|BW^;mC$H zM~3N`QQiiCkc=hy-X^XtW}AHMuIK_E7kJJcUXQSOQz0BIeP^DI-Olk8C96N3X2+h=l9T8ta3Ra8`Nm7xv(-S=M__`~@_Ppk#QnCqEIVy|VhuBYTeVh&N_(N?7y}fpm!A_5}g>m#$ zEnxfYkZz4$1*ctHwjwo`Y4XEt7#AKtV7_0jBn`JHvnvKy6!b)%?GH1onwNP<_LO?iq~|Pkr5j#q1aG7_Li^knC1-y`k`mFTCP&o>pPxzX0CG>G2r;6#=g% zcz}N*uf>p*#pX<(Tet(b7XPz@iNz|Xj@!R?c9VNM42fpg-p%rz`Y}H2?~;bp@SsNC z=!U*^g4tb_3>x8dosgi7prW&9kHgM3K1j|Q1o->{X9!lkr#fLf9#<9e8h0fD ztDQ0>EzQa#S0|Kn7tDp^!Q?~q$-(r}2mQzdI*!Rh>%gT7{)u`w{%5>Kh7Vg=km||;F#2IsFr(7l2Ocm zd~7>j3p065k@?RKKt)ak3Nqp z#cK*0-B=c~Yb|J}OUGCXF==%iuj38onBdEpFd|Ja8)G?f_QOIA3KY(Ms9fYG*=snf zEQKY$ZAIh#6CxdZqbiTm8S^$zUm_fC{U4mDjzCn68To+BEE%h^Fedg($rr?7HSayF z$r^xZ(weAf`~I7Yq*0^|IlsWk(qO?w<|3SZE)h-QWX}sMdQ;>kv4Ak9pGlA^966^i zw@SR@stYPB<$1%>D=r%}l5uanb`Mo^>z@Fxs<3})T$R;^f$`QISen+?_h_9b68Ez= zbtU^dXhB{~wx;n%tg6VNjk{QJN8t_8nU26LC+CPgU5Pmfz6o-M(Bu$xV6-gcd-UGs z^n-{#ZR_^x)&fI=C??V88*;R`;z4lm_x`2!D=67u*bk!fLnh%yF)qRH&!4_F{2jT8 z9D;6+^*77P9T-T~33Wexn6rpJ#e4ERHN81^xUkO_{|XZ_1s5%5b~N)cLXf`NPYMiv zD6uH_Fxa6y#WGK|T)Z}T+Nil{Zq1P~Q7ydK``fQ`uG7KshDCNNSSlUBOCA|#S1(ES zxHS<^6GzuZ?jNT}XnMI!_C9PCOI4?6mHYGq==xfri+_jn(y7*;c2+7_Ad?G|M#}-` zPj{;#Ew6PaO~CUtMOUn_^K(bnJ&*%=S$tzHuS@iMXrX30ll61yMj_PN z>;3M;6!>OQP`B1#TFlB;vsrAc`E{R!&ZGfpAIBC}o!&G)RE_?)q1@|k==H05vDHM1 z43$z-i7UpR(v^SC40EFL1EnaYSq7bv%6VB<;N)G3$a(=2 zz~6!7mS5sXCi)n5+q@yHAf zbmD2j}Q;@Z5O6-Tk}biLrS;gO7?o#kNrcDHShCZXBkeX`dw`BLRkYm z3EN?~g4W><9hI*s!T57v`#uQSB#~lTZMXs z=j8v=BhuyfeAjT8W|WxH-QjC?f}eBh2YEWPb1J4(d%U=cG9wbR$Y<9mwV+meLhM=p z1YkdJ-9Enoq;&wYU-k4>k-v)hOzgTrr+LGQJdmeQ0BN`SBEP5(DL z=-CN*zSCo|m@7&#ODLVc!@uts*1v8|ax05+We1%08baHcZHQU`M^{Jvqx+U68x-`S ztG)N7X%V;<>ET!_IYZV;7k{hrhVK5LQk++99*Mm6EI0{w-QLC=;k5dnon<*?uRo2~ zy;|i22`ikxyq6CLp6($jRcI<$$(aa7MmrKoASU9(4IQdjrwayLesZq) zY;paE!|r%oU5G)|{u@||j8V?Bz(eC^EIxV5;OWjr?#`}YjC1+z5D{dFD>T{!m#NV` zdTN7%L<@3*Q%6GM|60lDgOs)!9Atn?$cdyL@mCU~$qbN982X;-32?}t0@3%#D_WW= z;B~9kWL8-?rzU8PoPZlsa1q#Sfv`P+!ZI8;W77pMW9Qd_>2x`~239XHx}P5lVQ))r zzUA?JhG|@jNRVpLxrv+eGOsfC*z@v^#YY+Xl)RK|dn(W5VL|2bi>!^E5NKn^ZFA-K z`6Wo!hNZ{R6n-vncatOaA~6NfD1*E6QNa-OCPE=2%B$)72 zobXo6;Kx<+L+Sf?b3IkUd8e^>opKsC^wSiP;GC%=L!*wA{Odd&pOIt<-mfq7;tW4V z0cQlJSph`Ok^Jj^)mc!Du}AF5XbsfMDZzzo_RWAhp_}ccD+|cvdvXx`NX)|5(NAHk;L;3;fz%EAS7ZZh zQOjXG0uzozC{}|XfOwwE^KeMo)z5+_D~i{}kGr=b$@2g0_GZ&BECNn1wQta@Nd#hp zhS!Zj{rPA)2kw&G>WRGQ$?8q8W*jVA7(@oo^Bw`heY_-~ogUDBN-;B{k}%G_)thZx zg#Qf_asx(ry{a^*y%h~PpTW_be}1n|3)d|F^g)gr07NWm)IX5P4&mv)l)8!vy~h*W zt^5U|Xc!y6stAIBYx|osh?*@S3Iw zZVhrNb>}`HVGG@M1Zq^^ zJ$6M%fv@*Q|GJ(6z~3S_T@U_b=Q+`YLD%tyQXHqYJs97pU(XvLw0Yp7`LDOb8VAX# zmV=?!c3-=WUW`<`muqe-qt<`eR1sx6SsO;hZH~^pgC7G)Ro=E|0uDejqF34*@agJo z{T7tp!U|OWC3aLehLMY&3wH^nYl)6xEv)+1H#$z+Ub)(p zXG@6{C7%0FYFb$qQ1vt7pLrfJ*^<6YbylCG&_+qOYT2Qg)LoPT)6tjXBuCQHT~d|v zv(a+&Fd5D%cOn@lVJElV>n8f5B1dNaGLR!yRR&_V}rPZ|+N&-LXN@jEYfe=~!l`fRAhn!mSE-c>|-x z!@qM1p&C8JFASc|fSdPF*q3wX`=in!e!45#5Ob&X0@$8v5z<1H(Kpq!OJ%MEcy4Dm zB3W3DcKm0Vh)h}fXc<<^ZyPdN{r>g+|L}=6ppSvJ3{aJcb{wR;0lMCt+>C7L)XjUP zs{g(GV|ry-TdA;U>%WeugeF@8i;2!b^|3b>^6GTrx!4qNTL&5JIuW_=t>g#UZe)+1 zJ%iTis6GxxK@b+9&VuY zKQKkzU@}ZXM5^4~e3`%He6H)2SQn_~vj3J}wBF#BPd)zcEj6x=&(2PPi}gc7b=2eg z=EtGX;_0285k}oAip@r)ia1m|l-JeL=b?|yhe_n)sejtzviBsmY8>?}(Y-qzJzwFw z6#Z)|w-d2XmQI5Q=MchOYJ*xA(k+~{t&YsJCi@M=^?5*r${D6f2ds({>{cKzEzG;# zStwrKvDihpI zu!oNQ^egI{?gMK5(F$oFHM;h?a$>X9Bni>0U6B~$Tgz)V)DwA?%x>4d?SFphfP8SB z7Sn^Ijwc%B#3ldnh{3kS13-w2b#ddh(B@wzx$gMR0jgY{6Fh+hH!K{&Bq`;@=6$QM z5(J{)e3Ug9@7i$$`ip|17g?TXsPWB_(AzF20ez-s#$UunthqOZ8gc zry!*`p*&2rJV~)=hBQOeBByG^SQX#Nrd8`A(hd4<6vAnMXp}5KyK|a7GUJ1S$wOhh zC7IzHJj(F5xA-^nUj=;4EJopL{Me*W>zb&-8)Knbl5=&Q+<3;Fli6`Hn~8TZ`v^$Z z4mBJZM}mKg7o|a5ZtVJ8FeDF*=pPPFKTqwao%6$e>5eIRtQ*A_n@5*j;!J1u@cnxu z(B^kp^9GWGfq--Pr^T9h1u_@ZowG#D1SK%phf5b!uS`CXdO7bt0tU{W9E@+sTo!vq z8d^zrh={08D6+VW5h@XQ+POW_C_EMIbu!hMvRL!s(0e?K6DuH}Dt_jDA3YtfTRQj1 zXNJ=JK8hr4y8IP6n{e>Eufga=NDiA`0HLQWlH*VZz#1zZK>RG*hi8k`>6)*gU}R@@ zpbweMNe1M}ITk{>s5jJf^F>;iz_`^(=O{CXKOdUb~=kb&SC2FqW=mHR5Zwcuk1!4Ffl0 zXkQLsQRNb~>CO~i@mYqSK(r1>lxs*)JdlLLCW>GTT#2+S6Ow%{=t;q_1K29&IJ5Myy;GsC%nT+2jDDVfeoh)&>A;nrQ%HX9E zP2Iu>p!F~(q{p#dkdb2{aOT!`^my|7^Wd=5gvkzG`kF@INU_r70^*gPhp&@kj`sbVfFXp;fUv*^J4pL}TE~39I`}E%5XY8IkK8BoA z8GM#~===MI8d4!fq%5akNC6mwG4&q1%fwrlyEHH{Hg~zfE%EUw7L7(ul;Gw=I&@SU z;X71FgmUCAX02xLANuNJR0=al2JH{Bt9tIg#*?&;PNB9G*5MEoK1SnyesYz!x zQCDam4F4F~YQLBci>Q}syOc!j+>gNVuTTMp-xlSryHJKa>o@k;FmYp9J1dPU+y5Sy zXpL1Wh!cKnv-!UFbnh#6D*6-X@N9yOwBd#1M3m)-;9Zo5jc%eujn@1XC8i8A^EIL* z&g!xLFu~6X!HId6JR6x<`#6JC7W*>4>Y^VXN=k6Y`}^VqmczK-hkxvC$(I2@if9OF zDA%So&kNa$LmNL`jIm*L#RWPmZ)r}NWfwb^Cq>@d$V@`^tb`6_{l%$a0$rOBe}xv~ zsJ!Nh95z9DWPY3NO2W*b-G>{<4~OT&{P4rzIQJc@@ToCLs5z>C{C9EgE(b5kgsDT- zMM2qKfv<}?Vt8L#k<3Y?l$hIq6g(?}&d5mr!G$O}iOXd%TZW%1)(}gHsY^P>pnyz& zT_okI)$jmKd2?k5g&?5?J!S#Z za%TGAQhv*)8A59(?f%=9aOz~(B9!w8WeRPg=L5$uf4O}7FQ=o#>_tGD)*Xu~uPjoY zs9AwS>Q?&|-JJbo?&;h`DhBmm@_dq}AaTL_4?Y*=d$qJjMzM=zg0C6PR-XP&VPXOiE%&#D&WUCG05@mR#qzGU6zIAB!}G@IA; zi2SH{s)OI;S7sIc2^qMd#z!4RH%eO^*u1%9eTBxsrP%TpNs>NgZZ!}3`(|-L^7h4m zjL%h#(1t8?+<_wT6Is-&oTye!n zv9}J|UE5SK#&r5$7SVP8@N-k@aYI|af4}6ovr7L3ej6Bfo-(PL3?ChqCPF-@z!RZG zZezxV?#^7o93?<~<8$m`Vy{@$rRHtB(`c56<{kygTXTz|J(3x>dccT>MWSXVl!QXE znmtORDE$aZwDEXG8@O(1JI~Cplc(Ol0++*%IK6IFigTrUq=9}H)WfMNQz<-H?}!Z= zjZ+Kk<$xU(q<}{uS)RA z>YI*whKuhg-Z0`5Efvq_QJ8fFhiBYV767Z%gLdzypxSW;HW#p>_ zq3>Hyz4i1Qrxc(8Vtm{DY$c}MwXYQg#v5U$`6txz*dc( z7GqtC%d_~1<323%l7Yqsx{XAF3r-jN!M6LY(v=T##>XVycTH}-eJ~FQT2KPa1RtaH zYm~B@FE_*9CeMqX^et6wo9@9e_3hapPW#(22R)>${`wcYPDc~2aN=lMAZJ>Z=4wh;pbbMi1_lLq0HodICpGVoD8 zT$&&ko6e^l5riVp!rbT4JlO(m%3Lw`cTrSD!;i=TJKKL+OPFI(PKGMqpy^S1&U8Dc zDM_w_zhFYBe$snDhdeeNt$Z6?dIy?Cy?SlQd|3Qm1*pyQgjo`Jr598leBimy-<_OV z{Dfw^IQ@YB!N}~<_Tnz``w*?TRD$b*D0O$dxuYv@Vy4^=c-xgmxoX@NriR>9;xDHR z2l99$SM4e4#<^60%wuCWVS2In>;;xiPLvP}<$ip~)EjT+A!)}49x+p{(JfZWV&0vSm#zx|kTZ)&8)%{*iYhf;^!dn!-bd65UZNOan)D=b{xz56Z^ zEPb*d$?d6CJObUq3Wi|LX`{)W>7o~Ix6^6z_k~w#0fHz1zw`#u5bu^l+>k&oM#gIB zJO3-u_j}Uxjyb6Q8nkJf>$|IP@7bB;KBKX+;lZ)R1&T`Ar@al$JS|U3#i2#`gC9j^ z!4SL6mCwjPbW{Tiq{}MvDqtWgG*ON>Cu=zn?pJ`RrH^qwKP%% zDY(RWrT-kO_>IzNUw65?o&wB(ll{a8Qt=SvS}(~b7TBesP8~HuE?+@)iX;vuPW3)B z7L`l#Nq0+9&b%k-CN7lxCGE z@`A(bs_6|NePRfAJ>l5EDL|o8%7{Tp-THB4CMq^+>7SF2NfAnR4-6!#X^SarMj? zy8%iTy2L|CPmb?WB2b#ay|toZU3Dq+LYl~v)5j^JMDBwxl3kV;Zh!(Vx(NA);8Vz3 zrH&c^wnd_$noh4C^2hUL*P5Ng80wtN2@%BkgDC77S;Od11&mn}3xzJ3@2z zO^cDeAF?GSVKb%+B8ejFsVMmP=q;6c|NS5j;~I6#%`N{TUCjg4C>SI9(P01^wVdok z786}rVf;6aWa3|0s_0(x#7@lUcpdBXUM4)sdo}SrgCPN^*u|)QF&&t3Sg2cO9P$*P z<|~bA5pw>zhc}Th*os}Rfr`*;HEaBxbUWOU-^V$WcE;h?l1um$S^D&_0q0KW^DAa! z(06i4SGyhA579G9_H2GQd2VE_@$gSVn$RWK2z1?7L51ARxN8C7G zWGFu7K^?pd$}XIle_4;{=!|pIdE32!aDp4ojzFPkC3AA@goxG!Y&Y1NSm=!aF18w$ zGjjx0hrLwlcnJs0z%Bg|t*lDq=&cq4l}89-7Z;ZQul09aL)t3-w6I4lii`qZH#MU4 z*(yD!h-Nx8L1?7gdLIPa%sVM0k}sg@x4%F`)MYOS7(Z>o$@Vgd<%DI&!ifTbIq7-j zILbJGrh^-02epRaHuaE(*v;-v)$5x>yj8r4a^gF|PuFv1`bO?1};qRD9$ZZIwPQZ@ug`PJeHUfR6>EtBFHBA1`-(#_wew z;=Yq-e%DDzaX4{J!TlwI;h!nQaTQW`bi7<=6>Z||TL{PqR6kW+My;5Sf$B`hBIwGH zs%8V$7kPQ6mKj9xbW1g6%XhC<_M=o^;F7Z=iu`j?kDPeVxoCeg+Qgtw2aaJ{egsU7`;8Zwm?n~RwL{z^ z``tfWH>j%vc%(n`sr;`_tE_8bN3(*(f!QgAwHP^k%jJMlIK91OD9uq$FMj96AIT-< zq3}=!R2f8+{9XNr=&PDhw4LlCc=PU*+e;oQBx_AFsu5mfhN$7G{X3{*6e*T%xtj^y z$SVUEh7uHy@BnA@_Xx^8XIlua5}BM_7mT2Cn~j~FAxZO%KdPKv!3#}XAhYt-Ddm#9 z?#C4CQj7x>t7R7duonax4!9`SHT*Fjck#hI?M==7HhQGbl;PK}4Cx4b2<9A1`axveYjwv!KGs*2z3Z7qBaCOP^$kWT%=VBGBRZo%p06iy z;d5=QAl!sKLhV?}nN=<$;Fj?j7v==jH79p3?pQS@=F_Ia{QSGOq0{(!yw+1+r?xI# zeR#0E4zLI^>{$VOpg0w(Wjyxhd?V7|KR(qRwq-JK+eqw z*si#{s5~yr%i76M`J~NeYjJuoI7?Y8>?9E6dJ`=Dd%}nd_o;w>0@O9{TFWTuad)OI z|?!@)B=%se;xf;T+qnCp~Ef52DWxNImesHsa zSvtps+oPPn0@r7^0;r=#wo?yozY>ljC+(CMch5wvb*0Dh!`$+T1bjKoHc^-S3d;#w z{Xt(7?KKy-P3SKGlTEV$ZI9m5MR_2iVfI#AqO}`%X@Z>v0cMlF9S4s`?;KShcrzos z5>B0~>}g6qOQG=zgVZj;E_PtQcI8cMf@(;nE?Wqhy%lkil=~IIVDxSZ$r9={<#2H$%dOm}mV)9>JAGYW5gIeIK}&rzRw^2! z1xBwYqUUSl8IkbssPCn45L+ckT60I$%>34(uW04Z_fD0pJe;@Rbt5aGPN`1`P_i54J z14zoioQ9KJl<#DMRTA9U#^vI?Qw?vNtY)j2yA2}TKIhH|f`VMZ5Z4nOiRh6Hjm+CpkcqP8yj(V_uu;u7b>Bd$;aM6Z1nc;mx~!1v^iCSgH#EE(?<%EM$334 z2h*v>DSP7VaHUh9YQ4$us01`#YA-^}Pvg3rk-XvreDZBpqO^peZ!biTgnPQESbkZL za%rQviCfOwX08CI!kYX&cwiK+Oxx~;bq=i~i9Q*eEm}fg18W3zq9%dzWh*Wdm7rxKi$n=r>sv7=}uo|TRdqsXVyc6ORQyJa82 z7mR*$#BjW18#ChGVFNM8lu!{C;$jJ|@qB9DU29HF#gkt(^Vh5OVbL-L=&W8nO(wbj zRwyW#Y8FM(*8KTBO5}|5uEW%g`wZQdCjz3S)Vu{^%MmOz?m1KD>~pD=8|4N47z=NF zr20Yjeb&KaV>w!^otTOn3X>a@Ywi%mZ7{#(SZoZ;%8We(78$}Ifbok+xiZIH=gW{p zF&>M^2TuRx++ZJ7y5LF1u@otXTuOjZYa$)w2VX&bkOsa7E{5?k ze?TKVndNn&J&sy)FEsqj)AW)D1T`uUGl^%XfLm*=4MXvRooVJ**(*BOpUES;VX zL|Yr9cFff;sXp?hvjEK2K{bjm2&uXO-1dJWp!|$oX~MvBI~Z9A1ij&MI3MgYIRsc6 ztU2f6fl7p=A> zKqe?tBjNMit0VjI7a-5*LMa4?<^2Wa!Q^3GRnXJ;rVHc76}E~?vBX^_Z72*36vMgz zDHyy@Hb2YhHhVj$DH%1NE}N5vtcEA1-*bI=A2daT`g@L&)EZ?_-yWmw7ZzESS%^oB zX@F$1SmAGgkFyBlcTS8(JDqKs<5qIEgaEW#U=oS2YRv0xv&5W;R@~34MR*(jk(`aE zW3X+Rtw7gAo=`8>vcbh7pG*UVr6;fpi_XtQzy~F$wiibX?K>9Ew`6@E{u6WKG)m7M z$t_9vIRX#(IsDoc@jM2D-fw~)e1e~9q*?#sU$GVdBJ6@y3gThU7e|8nsQIFS+G55D zVyuxLe}zPJer%DG+W9F|tE{h!&Q%*^z!w*XW=u$E4&8s6_LVSDCYB(6TW*MX7%bs^tN2%i+U(t!p;)nA zXbYikpqdeNnChtKI1n|F3TBi+m6^#?fD}a|O)L2V_8moQr==$yTnJ{5uEuCd=+PRT z>12)A@0xSQ&)5(#&fcwl;v{b!3#-U9 zEe(2K^OhvEbq-73S;#rea(1+{C-|Rp&*jV)`1DPQ$$$LUtQ0%%K~x&)^W!VkD2out zBBviphw>%X3-EzD_WLLXufM6PLNRm11)~u8jC!sSoD!7p>?j)Vv`lcIZ_33eP`00o zpsz$w76K0xC-46DS#J3QH4ukCDSeAmUQyAy6(c7sH(KPQ_;XZAh}=uUnKLDkb23-{ z`|DB}g=+Q><7RJ&(ByC3`}#%M6~svn!swJ1*IaU$#R2=D zo-&HIJ8`apgxL`X2Fy3>v=w;cM`McNLFZ+^mEU{ipg?nB#m8rhSVOQZnlEduoiIG7 zHD?tgQ2Nldaqss_m)yBi$iLV;Jrb;#UlktbWdWD3p)m74*w+uvZ2?;_gf*X1rR6U&01h))7>>K@t9=Yt)H?HTy!3WIVTaW4D{_~} z7CNvb-o`GG8C#AVhaj+XQ(S&kAx=fxV1I#!=~rGBy?`nZMEYpx`2ps$(y9|OYElLh z{J9WwdhM0I9?Mrmk}6kU_VF9}YYvaUdTL6Oqw8R<%Pd_caV zl&WKIP!BCiqw^r^Vjr9WH&6y> zs)GJZtCz%Pi{swll>G@WnC1()?D1hGj@yVv)$cobr`uccR>2RB5wL9=E<9uwYi4-b z(hwd`7l?gqnXUKuC-}2?qo;G>CoC3uQwC?3^iDkv*BlQIR7B5jx1cU^YwY(-gl9pW zxEO>^e-a z_XD=%-Fo3J{1tnNRmgKsTHR!HRH&P$!;3zIbb_~~!GG!=bB{_QkNbc=;0keOnoHa} zgC1vDAx8LYAzm5ZyAt}0!Mn=443jacE7FGO8~$=Qs%&qH;$%0MCaUw2LCaN#0DI_(ihOQEzT zNIN@=P3HUVSgIj5q8j40cwM^tsQ;A2kX`A?P3Fus%f0|oz{aQhhsp_E}MHfVN#Tpp;s;W zdnUPrJnk%+uE8v$DpoG(yW9zE_}in;5U5@D1-RF`n&Bii*-rRY#ByBkKiD6>`QxOw zpPja7>shv$X%htejua98=2_t28_M3M`ayvul|1vOE~U8tyU&wiadrM80f_yxzp^NZ(SCMIU&r4WAA1fac0QF zE%ryH2idk?dFdxtw>rL;{=;jO#ETmJrt@b+jO?uu(2mltIi1-;g8_?`$)xg` z&&;+{fwOHE+CmZGAd~%t#F6HO)AQoXql2VTbO%L|>OdIk?6lX4#Cvf;6Fpc8SbkMO zugcn@hl9DcY4@-rc1&iInYb5-i<7#ekbJ8k7|R`}i6gO!`Zo;Y12d8jZo37+v7)k* z!oTvY^oW#6fL#Nn<=X9|^4(Vsao!@Krb-_~BAtIBZv3g^D#7;Qp4=bP8L(w#hFPl~ z#Kif-B;)PdHKorA8-HAw^@`oHj{3QF#rc~%X&W{dNscfbx8itT2F8<~7858=Lkk+y z@_l1f!#B`7x9yZ2O<8eYLi|CUO|Yb3IC(9HkS0AFr-^bWUp;5pFHoxU{%*rI-p1We z9)EPGZk@{{*28|}{O=MA>PexQwP`nQXoUF=8J!vtPhxAflc%JS^m`Tt&AxF&%E1VY zT7;J=^#gSzR%d_38#j{h6iT058YR+WCgg?~^DKuFO-bS=?baH{qiTr;S^CPMnI@6` zpoF5i)wv&b-7Z8$M(j&1aI8&VVyV%1BsW;1J(W!xmiw)>6435OZH3v(YJ2vA#qAXbNs-nB&hFs%UgMrH~01D5jf)09M#qM2i?*j`iRwW@5>wcz|`E!Kg z-#^SZ;JsUHckY3%Qwf{>d^b5B%NLcx#Nl&!q|fbAgGp?$oaeni{J~A_(!2VFZ}H8< zQn4^N5NQY2hkJkEu{5F+x6y#O+KEX+meXF(-CcQP^z@tj-aC>nk`7q*QwzRU|$ zdb(_B#-GO4sijd!pMwx4*?xJXm5QQ&L`W@-*HNw$n*)NYH-glxb*7;T^t=~h>^qiE zF9#wO=f~)nj8sk8zUNt8Enm20{boS?r6SJXUid6&utKLYVczmaR4OpBaRAuodTm1K zS}z3tD(%dg4Zz!+STdVuB zt}u_MD74-sR8Fi(?`q8a^=~(B&&0R9lT3PUhn&)zX{mHhHhBZ3J?&k>W=4fkUz&|miOHDYEUb~wGEbImn=q2uT9F_PEbs< zcY3ZZ6>wf+gu(h$-(88W$?VZ`McGg+ddTht;2n)vxtpCEM-cKT>_z}dpW6{^3=iRR z!WJ8O@DSfl`jm*wJCsc4m>Tx;7h6PqT*P|O%9SZJy*v2xO0IHCnu)6(l)q13@KgdA zVn_v(gM_V;TFW)&h1uA6tmrhqU0sQNwh8H#F$|-f(Fhk?FHEoeQvXh&46`8y%RehF z@?T~_dF3+K_yxrr&bv{7p~|#uAIs)fmkb*<$p;e;=285lc8=JBX_dm_YCw&1 zMkxEST#|~*k@^$aw_;YbT-!GOd#CrC4vEGzgesV*#@gbd2?#?=(i|oz_78&X%=Gu> z0Z`Qy^%uO@^~9j0nn7Ewy;g8GqkM^lz(b} z5uj2B?PjLo_TRQ@<8$yl`z>%JmPl35;0Kj?&pN2U7HAzQ;y6C2lrv@oVZ8~c9%G5W{G1P(#wwV6gn(N+o zg`Q=b5{h9cr6;Dnk)P#`5g#pLSj9>$nzMn3o#5OGx7IA=we?hCzg-l>A|Sl63lWEntoqaFy?c1<$f8JjNeVhnv_6q$$AC0+#kJnUCBy;tYuOXdWc# zBb3MAsm7L?bU@gc$R2fGat3v@7HiWJXM)SmRNsZ_$9!dDMN>A>?)WrEDQK%gp|O92 z%~DiRl4+{2t%#o`5bz?zEDIQ`7g=ilV`#fF9-rsjm0~;U5*VLrV@!Hso?!p{@Lqvv zvhZMApZxf64p6`ppk9rY1eIC5*v zFAKx{fo_hrIq*D56i)U0qB&8mDIXoygURxlG`P~lBoy+`Z7N>5UsS9T6>jc)ho<)_ zs?dHhSUJ*wEQs9Wr2TfRJ|`I}{l}LV1Cm|)w))*>J;10No`;e=aN*=)ia5($N*yC9 z+@(*{VfwPFdZa0@)|6f~bzP(Hz2{F!yF$7B)Lx0* z@lZGR&2XHh^8~|}j9H~g?l$4PS;dv`N^Il?Z9~i)AIvgOYR1yUYND@PTu{cdVYT*K zgrcpN?!ZvQJ_QQmM$V`Sdmj5f*4iDZ*vh=TpiD;$XSD|Gs8D%!LA&h;nE^T&g6wFG@HfC4jHMgH?`YE z*s~!z&BzntSz(akC845TQ(b~3a0znjJo=OP@Ce9-839fzllJ_PG|ffh0Tx}#?S!$O zK6d>K$t~ZJ`h?zPo4=ICOufu{2r9_WrTe_%-c#g%m|c%HhvTjqA>UbXdbaB%?#>Pl zSaiS{+9R5loti`YiHFMBFs6vdF0s%gUYZhh+?m)){w&zsakY!{-9`c*jy(E9+=wWY zu|gUq)-vavHlpfP6!|DIrK4Wg(Q#t^N~o(B@81XbW4Bn1s>H4qE%&C{vpVKis67C| zURq~==KyII`Jl-C!>j?|8&HfD(g5~f0mwlEa2OXTjCtn>HY1X^iQ#P)P1%`?cLO>@ zRYNXb=$Iq)@X`Wrw+Om1i>$;Y2tCdVtQmNMD@5&A53}RBC;imArH|PTu{Jvhtf5$PLkp$s;#^uiMz9uHm?rbz zImBGz(cE~s%rUegvI^*29^lU)^?4T#{+`DS9kyVz9QFijnSUn8gg-a10uH1>9J0W| z6Q_Bt8-7y$oX{2%@(t~-57~J^3Pr4cr;F$@#1!c)EV{zpHA{~vN5V^rPD0<4qL^?G zcmmBQi=%<&cv6}p$RnPvsBQB47_x%5P?$6sSToCG)H5?-V1DIg4!T7Jl4xg z_Mg)T%a?%aC6ERR0!4x;J~o$AYMA582=W2MLZZ1c0gfkqP8w8$J}FAEu&x__%()%| z!3J^Z&~~Ugfd@eKiqJ}Ut8UkV{2M)zgBkL#cP&sXSr8s%I?H>I*_N!WGuwn=Tcfha z-_qjDC^g#@vd&bkBr?YBVN*$}%8c%uYs9K~j$i`fU7aY%)A^{fE>J?wNmdS@wfhTk z^{nG(FU+0F=S#jmkkcPV`W`cX-Oe?j8NP2|^8q?YEo#V(BH3g>wz^qX%hW@G_mNnC zrlHuo7^%Wcjgsge-?BAo3o){0HdfX-Jxrfq+FsIO>D2hiG=+wW>5xr_%JQXb+sFaW zRU*-3ag98jBaVva2CJ6oS@Ll{lJ&ZPnWVo_(j>DjxLzSDau3iv z|F=>dug2&9R*Lx#2R8pn<2q;9y_alndO7xQ(APU{hLbvA^;XjDNJ83IgEDR^|r z(b5M!FuW^i@@bBVyBQk6-{p2KXuS};NcCN@+5u%t?5U6sdG7)FxY%rG*_$1^`*pLWqq9#*u zgvUh8UZSA`S_~l%_u-|5%n?00eKix>ClW>YNp&{X1N48-cUvvuDsvwU@LBVuUN%C6 z8~s?g;jDGydQ2*FU!U5c#dS1P5&?{;Ok>BSJ}$k5s1!JV`qI82$1r50L3W=O7Ls_a2!vxdFL-)sg zZ&Ng=hYv$A-SKEoJMfna+2+Nd$lQRKnqbgo5!MoaGr|P$slS0XrGHTD?|~6jjEzZ; zxo&G~FlI@x){d=rO)>-+xRw%VG0UdyU&4-JiiHAHLC<3s8>VV+#y6`0uTcHz;l)!} zj7eCGsOBI1{L0!-oymFca9S(kfSHo!^)OBHKG|%9NT|#*dB@a*|>Q zjXiz&6GkZw#nZ-o6o#qu<`PV&qFV|q3W{oqHyj#8%8xTYWA+G6J5H{KZJp5k%|@8V zoNS;IiMkeg@N6>Cp9z{5vYH(kyJk7bu5i$Qg?V2bh#pkKg;XYgQ>pXgS(HHvSqQ z)NBO`Ty{Ny5XnFoUN4Hv|9BC_UR8hr@_(XUkIDauV*ca7$$w}dT=M*$DdrsnN3SN1 zK^`fm;&Ag`*`zbB0YqBy1`<|I8TCD7_zSNOmD$v^*e5>rA+UTS>9)i417@u(Qd{qT zi&jH0T}1OsUYqc8Bau}^hin;UEHQ`$wHDdU)TFcka_cPoGQ|8T+U??8cFK`AR2X!K zBn34%Ktpb)9(TxUT7p-?r0lEV8g`i$q|Q^KJ{Ii7&b!H{V9O5L!%k929-J|Fj6#k` zi2@86jy$zNnog`PIt~}vA~%qgEIlfJo7!k+M@DfP_OWTNh8xnZ$Ue-%<%5xnsT2dg zjy&HmO^6xN=_PGqxMG&6Op)WroGo#{Tu&jN)b6y3=PHx_RzUM78DGmPC$}CuH(} zZ@}d{ckqZT7#ZHwB8rZTwu7R(V=E$pa%M} z7y&C)1G82PKxYacQ^lMCu9qQ>pf3~aahC)7`9n3zMKLZl`3acU<1UwDj-VwuiH(@( z1j#RMgiU|+6Dkb zzpi_%5fn$@vHMDppF&)}K?Qb+7UA=r4Lo+m2C9fg4kP?3loA-LjUc{d+kON6%fCGC p!6eTw+8tWFabjc*qNMP webCtx.webServer.register({ + kind: "prefix", + path: channel, + handler: async (req, res) => { + if (req.method !== "POST") { + res.setHeader("Allow", "POST"); + res.writeHead(405); + res.end(); + return; + } + const connection = webCtx.get("connection"); + const rejection = connection?.requestRejection?.(req); + if (rejection !== void 0) { + res.writeHead(rejection); + res.end(rejection === 401 ? "unauthorized" : "forbidden"); + return; + } + const chunks = []; + for await (const chunk of req) chunks.push(chunk); + let body; + try { + body = JSON.parse(Buffer.concat(chunks).toString("utf8")); + } catch { + res.writeHead(400); + res.end("body is not JSON"); + return; + } + const rawPath = new URL(req.url ?? "/", "http://localhost").pathname; + const endpoint = rawPath.startsWith(`${channel}/`) ? rawPath.slice(channel.length + 1) : ""; + try { + const result = await rpcHandler(endpoint, body?.payload); + res.writeHead(200, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ + type: "server-response", + rpcId: body?.rpcId, + result + })); + } catch (err) { + res.writeHead(500, { "Content-Type": "application/json" }); + res.end(JSON.stringify({ + type: "server-response", + rpcId: body?.rpcId, + result: { + ok: false, + error: { + code: "internal", + message: err instanceof Error ? err.message : String(err) + } + } + })); + } + } + }), `dsh-ppt: ${channel} rpc route`); +} + async function apply(ctx, config) { const bundledPptSkillRoot = fileURLToPath(new URL("../skills/dsh-ppt", import.meta.url)); registerPreviewAssets(ctx, previewFiles, path.join(bundledPptSkillRoot, "references")); @@ -3615,17 +3671,18 @@ async function apply(ctx, config) { maxDecksPerSession: config.maxDecksPerSession ?? 50, maxActivities: config.maxActivities ?? 200 }), { maxSlides: config.maxSlides ?? 40 }); - // Harness 0.1.5 registers an RPC channel as a webServer route owned by the - // Context that read `connection`, and that Context must itself declare - // `webServer`. Registering from a scoped inject Context is upstream's own - // pattern; reading `ctx.connection` directly throws - // `cannot get property "webServer" without inject` and fails the whole tree. + const rpcHandler = pptRpc(service); ctx.inject(["webServer"], (webCtx) => { - webCtx.connection.rpc.handle("/dsh-ppt", pptRpc(service), { authority: "trusted-host" }); + registerPptRpcRoute(webCtx, "/dsh-ppt", rpcHandler); // Older loaded clients can finish their in-flight requests after upgrade. - webCtx.connection.rpc.handle("/kimi-ppt", pptRpc(service), { authority: "trusted-host" }); + registerPptRpcRoute(webCtx, "/kimi-ppt", rpcHandler); + try { + webCtx.connection?.rpc?.handle?.("/dsh-ppt", rpcHandler, { authority: "trusted-host" }); + webCtx.connection?.rpc?.handle?.("/kimi-ppt", rpcHandler, { authority: "trusted-host" }); + } catch {} }); registerPptTools(ctx, service); } //#endregion export { Config, apply, inject, name }; + From 23bd5d5ee744ddf18f0250da0d46af892017517d Mon Sep 17 00:00:00 2001 From: yaojin3616 Date: Tue, 15 Sep 2026 06:10:19 -0700 Subject: [PATCH 4/7] update --- src/preload/windows-titlebar.ts | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/preload/windows-titlebar.ts b/src/preload/windows-titlebar.ts index 70406cf02..1d89b5c92 100644 --- a/src/preload/windows-titlebar.ts +++ b/src/preload/windows-titlebar.ts @@ -1,4 +1,5 @@ import type { IpcRenderer } from 'electron' +import { WINDOWS_TITLEBAR_HEIGHT } from '../shared/desktop-menu' const LAYOUT_STYLE_ID = 'dsh-desktop-windows-titlebar-layout-style' const DRAG_REGION_ID = 'dsh-desktop-windows-drag-region' @@ -47,11 +48,13 @@ function installLayout(document: Document): void { ${CAPTION_WIDTH_PROPERTY}: calc(100vw - env(titlebar-area-x, 0px) - env(titlebar-area-width, calc(100vw - 140px))); box-sizing: border-box !important; height: 100% !important; - padding-top: 0 !important; + padding-top: var(--dsh-titlebar-safe-inset-top, 36px) !important; + background-color: var(--dsw-alias-bg-base, #ffffff); } body.dsh-desktop-windows-titlebar-layout > #root { height: 100% !important; min-height: 0 !important; + position: relative !important; } :root { --dsh-titlebar-safe-inset-top: 36px; From ccc9667fc8e1c4c3f99d14342e0dc7313c81f65e Mon Sep 17 00:00:00 2001 From: yaojin3616 Date: Tue, 15 Sep 2026 06:37:16 -0700 Subject: [PATCH 5/7] update --- src/preload/windows-titlebar.ts | 85 +++++++++++++++++++++++++++++++-- 1 file changed, 82 insertions(+), 3 deletions(-) diff --git a/src/preload/windows-titlebar.ts b/src/preload/windows-titlebar.ts index 1d89b5c92..1ba231b29 100644 --- a/src/preload/windows-titlebar.ts +++ b/src/preload/windows-titlebar.ts @@ -5,6 +5,10 @@ const LAYOUT_STYLE_ID = 'dsh-desktop-windows-titlebar-layout-style' const DRAG_REGION_ID = 'dsh-desktop-windows-drag-region' const SIDEBAR_WIDTH_PROPERTY = '--dsh-desktop-windows-sidebar-width' const CAPTION_WIDTH_PROPERTY = '--dsh-desktop-windows-caption-width' +const NO_DRAG_PATCH_SELECTOR = + 'button, a, input, select, textarea, [role="button"], [role="tab"], [role="menuitem"], [role="dialog"], [data-dsh-no-drag], dialog, [class*="close" i], [class*="button" i]' +// One above the drag region (2147483644), below any system notifications. +const NO_DRAG_PATCH_Z_INDEX = '2147483645' interface TitlebarLayoutMountOptions { document: Document @@ -17,6 +21,7 @@ export function mountWindowsTitlebarLayout(options: TitlebarLayoutMountOptions): installLayout(document) installDragRegion(document) + installNoDragPatches(document) trackSidebarLayout(document) document.addEventListener('pointerdown', () => { @@ -48,13 +53,11 @@ function installLayout(document: Document): void { ${CAPTION_WIDTH_PROPERTY}: calc(100vw - env(titlebar-area-x, 0px) - env(titlebar-area-width, calc(100vw - 140px))); box-sizing: border-box !important; height: 100% !important; - padding-top: var(--dsh-titlebar-safe-inset-top, 36px) !important; - background-color: var(--dsw-alias-bg-base, #ffffff); + padding-top: 0 !important; } body.dsh-desktop-windows-titlebar-layout > #root { height: 100% !important; min-height: 0 !important; - position: relative !important; } :root { --dsh-titlebar-safe-inset-top: 36px; @@ -149,6 +152,82 @@ function installDragRegion(document: Document): void { document.body.appendChild(dragRegion) } +/** + * The drag region above intentionally sits on top of page content (at z-index: 2147483644), + * so `-webkit-app-region` resolves to `drag` for the strip and CSS rules like `no-drag !important` + * on lower layers never win against Chromium's non-client hit testing. + * + * Punch transparent `no-drag` holes one layer above the drag region (z-index: 2147483645) + * for every interactive element (buttons, links, inputs, dialogs, newly opened modals/popups) + * that intersects the titlebar strip, so that: + * 1. The window remains full-height without an artificial 36px blank band; + * 2. Clicks fall through (via pointer-events: none) to all interactive controls beneath; + * 3. Any new popup or modal mounted to the DOM is immediately discovered by MutationObserver. + */ +function installNoDragPatches(document: Document): void { + const patches = new Map() + + const sync = (): void => { + for (const [element, patch] of patches) { + if (!element.isConnected) { + patch.remove() + patches.delete(element) + } + } + for (const element of document.querySelectorAll(NO_DRAG_PATCH_SELECTOR)) { + if (element.id === DRAG_REGION_ID) continue + const rect = element.getBoundingClientRect() + if (rect.width <= 0 || rect.height <= 0 || rect.bottom <= 0 || rect.top >= WINDOWS_TITLEBAR_HEIGHT) { + const stale = patches.get(element) + if (stale) { + stale.remove() + patches.delete(element) + } + continue + } + const top = Math.max(rect.top, 0) + const height = Math.min(rect.bottom, WINDOWS_TITLEBAR_HEIGHT) - top + let patch = patches.get(element) + if (!patch) { + patch = document.createElement('div') + patch.setAttribute('aria-hidden', 'true') + patch.style.position = 'fixed' + patch.style.pointerEvents = 'none' + patch.style.userSelect = 'none' + patch.style.background = 'transparent' + patch.style.zIndex = NO_DRAG_PATCH_Z_INDEX + patch.style.setProperty('-webkit-app-region', 'no-drag') + document.body.appendChild(patch) + patches.set(element, patch) + } + patch.style.left = `${rect.left}px` + patch.style.top = `${top}px` + patch.style.width = `${rect.width}px` + patch.style.height = `${height}px` + } + } + + let frame: number | null = null + const schedule = (): void => { + if (frame !== null) return + frame = window.requestAnimationFrame(() => { + frame = null + sync() + }) + } + + const observer = new MutationObserver(schedule) + observer.observe(document.documentElement, { + childList: true, + subtree: true, + attributes: true, + attributeFilter: ['style', 'class', 'hidden'] + }) + window.addEventListener('resize', schedule, { passive: true }) + window.addEventListener('scroll', schedule, { passive: true, capture: true }) + sync() +} + function trackSidebarLayout(document: Document): void { let observedSidebarColumn: HTMLElement | null = null const resizeObserver = new ResizeObserver(() => updateSidebarWidth()) From 6c38bd6b3cbff224dd190bf79ab333385744822b Mon Sep 17 00:00:00 2001 From: yaojin3616 Date: Tue, 15 Sep 2026 07:24:04 -0700 Subject: [PATCH 6/7] update --- src/preload/windows-titlebar.ts | 98 ++++++++------------------------- 1 file changed, 23 insertions(+), 75 deletions(-) diff --git a/src/preload/windows-titlebar.ts b/src/preload/windows-titlebar.ts index 1ba231b29..f707a843d 100644 --- a/src/preload/windows-titlebar.ts +++ b/src/preload/windows-titlebar.ts @@ -5,11 +5,6 @@ const LAYOUT_STYLE_ID = 'dsh-desktop-windows-titlebar-layout-style' const DRAG_REGION_ID = 'dsh-desktop-windows-drag-region' const SIDEBAR_WIDTH_PROPERTY = '--dsh-desktop-windows-sidebar-width' const CAPTION_WIDTH_PROPERTY = '--dsh-desktop-windows-caption-width' -const NO_DRAG_PATCH_SELECTOR = - 'button, a, input, select, textarea, [role="button"], [role="tab"], [role="menuitem"], [role="dialog"], [data-dsh-no-drag], dialog, [class*="close" i], [class*="button" i]' -// One above the drag region (2147483644), below any system notifications. -const NO_DRAG_PATCH_Z_INDEX = '2147483645' - interface TitlebarLayoutMountOptions { document: Document ipcRenderer: Pick @@ -21,7 +16,6 @@ export function mountWindowsTitlebarLayout(options: TitlebarLayoutMountOptions): installLayout(document) installDragRegion(document) - installNoDragPatches(document) trackSidebarLayout(document) document.addEventListener('pointerdown', () => { @@ -125,18 +119,19 @@ function installLayout(document: Document): void { body.dsh-desktop-windows-titlebar-layout select, body.dsh-desktop-windows-titlebar-layout textarea, body.dsh-desktop-windows-titlebar-layout [role="button"], + body.dsh-desktop-windows-titlebar-layout [role="tab"], + body.dsh-desktop-windows-titlebar-layout [role="menuitem"], body.dsh-desktop-windows-titlebar-layout [data-dsh-no-drag] { -webkit-app-region: no-drag !important; } #${DRAG_REGION_ID} { position: fixed; - z-index: 2147483644; + z-index: 10; top: 0; left: 0; right: calc(var(${CAPTION_WIDTH_PROPERTY}, 140px) + 44px); height: 36px; background: transparent; - pointer-events: none; user-select: none; -webkit-app-region: drag; } @@ -150,82 +145,35 @@ function installDragRegion(document: Document): void { dragRegion.id = DRAG_REGION_ID dragRegion.setAttribute('aria-hidden', 'true') document.body.appendChild(dragRegion) -} - -/** - * The drag region above intentionally sits on top of page content (at z-index: 2147483644), - * so `-webkit-app-region` resolves to `drag` for the strip and CSS rules like `no-drag !important` - * on lower layers never win against Chromium's non-client hit testing. - * - * Punch transparent `no-drag` holes one layer above the drag region (z-index: 2147483645) - * for every interactive element (buttons, links, inputs, dialogs, newly opened modals/popups) - * that intersects the titlebar strip, so that: - * 1. The window remains full-height without an artificial 36px blank band; - * 2. Clicks fall through (via pointer-events: none) to all interactive controls beneath; - * 3. Any new popup or modal mounted to the DOM is immediately discovered by MutationObserver. - */ -function installNoDragPatches(document: Document): void { - const patches = new Map() - const sync = (): void => { - for (const [element, patch] of patches) { - if (!element.isConnected) { - patch.remove() - patches.delete(element) - } - } - for (const element of document.querySelectorAll(NO_DRAG_PATCH_SELECTOR)) { - if (element.id === DRAG_REGION_ID) continue - const rect = element.getBoundingClientRect() - if (rect.width <= 0 || rect.height <= 0 || rect.bottom <= 0 || rect.top >= WINDOWS_TITLEBAR_HEIGHT) { - const stale = patches.get(element) - if (stale) { - stale.remove() - patches.delete(element) - } - continue - } - const top = Math.max(rect.top, 0) - const height = Math.min(rect.bottom, WINDOWS_TITLEBAR_HEIGHT) - top - let patch = patches.get(element) - if (!patch) { - patch = document.createElement('div') - patch.setAttribute('aria-hidden', 'true') - patch.style.position = 'fixed' - patch.style.pointerEvents = 'none' - patch.style.userSelect = 'none' - patch.style.background = 'transparent' - patch.style.zIndex = NO_DRAG_PATCH_Z_INDEX - patch.style.setProperty('-webkit-app-region', 'no-drag') - document.body.appendChild(patch) - patches.set(element, patch) - } - patch.style.left = `${rect.left}px` - patch.style.top = `${top}px` - patch.style.width = `${rect.width}px` - patch.style.height = `${height}px` - } - } - - let frame: number | null = null - const schedule = (): void => { - if (frame !== null) return - frame = window.requestAnimationFrame(() => { - frame = null - sync() + // When any modal or dialog is open, hide the drag region completely + // so all buttons (especially near the top 36px) are 100% clickable. + const modalSelector = + 'dialog[open], [role="dialog"], [aria-modal="true"], [class*="modal" i], [class*="dialog" i]' + + const updateDragRegionVisibility = (): void => { + const hasModal = Array.from(document.querySelectorAll(modalSelector)).some((el) => { + if (el.id === DRAG_REGION_ID) return false + const style = window.getComputedStyle(el) + return ( + style.display !== 'none' && + style.visibility !== 'hidden' && + style.opacity !== '0' && + el.offsetWidth > 0 && + el.offsetHeight > 0 + ) }) + dragRegion.style.display = hasModal ? 'none' : 'block' } - const observer = new MutationObserver(schedule) + const observer = new MutationObserver(() => updateDragRegionVisibility()) observer.observe(document.documentElement, { childList: true, subtree: true, attributes: true, - attributeFilter: ['style', 'class', 'hidden'] + attributeFilter: ['open', 'style', 'class', 'hidden', 'aria-hidden'] }) - window.addEventListener('resize', schedule, { passive: true }) - window.addEventListener('scroll', schedule, { passive: true, capture: true }) - sync() + updateDragRegionVisibility() } function trackSidebarLayout(document: Document): void { From 212dc139d31ee8481de3f70b7443560a68f7694e Mon Sep 17 00:00:00 2001 From: yaojin3616 Date: Tue, 15 Sep 2026 07:28:39 -0700 Subject: [PATCH 7/7] update --- .../dsh-desktop-market-installer/index.js | 25 ++++++++-- packages/dsh-plugin-gis/client/client.js.map | 1 + src/main/state/market-baseline.ts | 45 ++++++++++++++++-- src/main/state/web-home-import.ts | 24 +++++++++- test/market-baseline.test.ts | 47 +++++++++++++++++++ test/web-home-import.test.ts | 1 + test/windows-titlebar.test.ts | 5 +- 7 files changed, 138 insertions(+), 10 deletions(-) create mode 100644 packages/dsh-plugin-gis/client/client.js.map diff --git a/packages/dsh-desktop-market-installer/index.js b/packages/dsh-desktop-market-installer/index.js index 0e6654b52..977f8db48 100644 --- a/packages/dsh-desktop-market-installer/index.js +++ b/packages/dsh-desktop-market-installer/index.js @@ -506,6 +506,12 @@ export function createDesktopPnpmService(options) { // untouched, so anything that already loaded it is unaffected. await rm(marketPath, { force: true }) } + const workspaceYamlPath = join(profile, 'pnpm-workspace.yaml') + try { + await readFile(workspaceYamlPath, 'utf8') + } catch { + await atomicWrite(workspaceYamlPath, 'packages:\n - .\n\nnodeLinker: hoisted\nautoInstallPeers: false\n') + } const registry = await resolveMarketRegistry({ profileDir: profile, args, environment }) if (isCancelled()) throw new Error('The package operation was aborted.') const env = buildPnpmEnvironment(binDirectory, environment, executablePath) @@ -518,14 +524,27 @@ export function createDesktopPnpmService(options) { windowsHide: true, detached: process.platform !== 'win32' }) setCancel(() => killProcessTree(child)) - child.stdout?.on('data', chunk => write(chunk.toString('utf8').replace(/\r?\n$/u, ''))) - child.stderr?.on('data', chunk => write(chunk.toString('utf8').replace(/\r?\n$/u, ''))) + let failureOutput = '' + child.stdout?.on('data', chunk => { + const text = chunk.toString('utf8').replace(/\r?\n$/u, '') + failureOutput = `${failureOutput}\n${text}`.slice(-2000) + write(text) + }) + child.stderr?.on('data', chunk => { + const text = chunk.toString('utf8').replace(/\r?\n$/u, '') + failureOutput = `${failureOutput}\n${text}`.slice(-2000) + write(text) + }) const exit = await new Promise((resolveExit, rejectExit) => { child.once('error', rejectExit) child.once('close', (code, signal) => resolveExit({ code, signal })) }) setCancel(() => {}) - if (isCancelled() || exit.code !== 0) throw new Error(`Market install failed: ${exit.signal ?? exit.code}`) + if (isCancelled()) throw new Error('The package operation was aborted.') + if (exit.code !== 0) { + const detail = failureOutput.trim() + throw new Error(`Market install failed: ${exit.signal ?? exit.code}${detail ? ` (${detail})` : ''}`) + } const installed = JSON.parse(await readFile(join(profile, 'node_modules', MARKET_PACKAGE, 'package.json'), 'utf8')) const expected = spec.slice(spec.lastIndexOf('@') + 1) if (installed.version !== expected) throw new Error(`Market install expected ${expected}, found ${installed.version}`) diff --git a/packages/dsh-plugin-gis/client/client.js.map b/packages/dsh-plugin-gis/client/client.js.map new file mode 100644 index 000000000..acc17b1ee --- /dev/null +++ b/packages/dsh-plugin-gis/client/client.js.map @@ -0,0 +1 @@ +{"version":3,"file":"client.js","names":["isEmpty","extend","equals","arrayEquals","Event","EventTarget","EventType","Event","ObjectEventType","isEmpty","Property","Event","CollectionEventType","Event","EventType","PointerEventType","EventType","MapBrowserEventType","EventType","TileState","none","createOrUpdate","Relationship","equals","extend","intersects","wrapX","add","rotate","scale","wrapX","METERS_PER_UNIT","METERS_PER_UNIT","RADIUS","EXTENT","PROJECTIONS","cache","get","add","get","fromLonLat","makeUTMTransforms","makeUTMProjection","get","getProj","METERS_PER_UNIT","equivalent","getTransformFunc","EPSG3857_PROJECTIONS","EPSG4326_PROJECTIONS","apply","toString","fromString","scale","tmpTransform","createTransform","getProjection","linearRingss","squaredDx","squaredDistance","intersects","forEachSegment","linearRingArea","squaredDistance","squaredDx","linearRingsArea","ViewProperty","ViewHint","polygonFromExtent","centerNone","METERS_PER_UNIT","rotationNone","coordinatesEqual","MapEventType","EventType","equals","EventType","EventType","defaults","InteractionProperty","MapBrowserEventType","all","always","MapBrowserEventType","all","centroid","centroidFromPointers","Event","EventType","Key","EventType","always","all","EventType","centroidFromPointers","centroidFromPointers","LayerProperty","Event","Property","CollectionEventType","ObjectEventType","EventType","LayerProperty","EventType","intersects","RenderEventType","RBush","colorFromString","EventType","getCacheKey","ImageState","EventTarget","ImageState","EventType","iconImageCache","iconCache","ImageState","ImageState","iconImageCache","getIconImage","ImageState","ImageState","getIconImage","EventType","style","flatStyles","isEmpty","Circle","RBush","toStyleFunction","flatStyleLike","Event","wrapX","iconImageCache","ObjectEventType","RenderEventType","fromString","Map","createTransform","defaultControls","defaultInteractions","MapProperty","CollectionEventType","applyTransform","PointerEventType","EventType","ViewHint","RenderEventType","MapEventType","MapBrowserEventType","ObjectEventType","equalsExtent","equals","EventTarget","EventType","TileState","TileState","TileState","createOrUpdate","canvasPool","applyMatrix","intersects","TileState","renderReprojected","EventType","ImageState","EventType","createTransform","equals","toTransformString","RenderEventType","composeTransform","createTileCoord","equivalent","applyTransform","TileState","intersects","equals","TileProperty","Relationship","CanvasInstruction","equals","CanvasInstruction","CanvasInstruction","CanvasInstruction","intersects","CanvasInstruction","PolygonBuilder","Builder","ImageBuilder","LineStringBuilder","TextBuilder","createTransform","composeTransform","applyTransform","equals","CanvasInstruction","intersects","createTransform","composeTransform","isEmpty","createTransform","intersects","equals","intersects","ImageState","ViewHint","RenderEventType","intersectsExtent","getSquaredRenderTolerance","defaultRenderOrder","wrapExtentX","equals","CanvasBuilderGroup","getRenderTolerance","EventType","style","forEachSegment","squaredDistance","squaredDx","linearRingssArea","linearRingssCenter","createTransform","linearRingssCenter","getProjection","RBush_","equals","isEmpty","createOrUpdate","getProjection","Event","allStrategy","VectorEventType","EventType","ObjectEventType","CollectionEventType","isEmpty","createOrUpdateTileRange","createOrUpdate","createOrUpdateTileCoord","getProjection","METERS_PER_UNIT","createOrUpdate","tileCoordHash","getTileGridForProjection","scaleSize","Event","TileState","TileEventType","equivalent","getTileGridForProjection","TileState","EventType","getProjection","EventType","getProjection","equivalentProjection","getProjection","isEmpty","Circle","useRef","useState","useMemo","useCallback","Map","styles","h","styles"],"sources":["../src/client/locales.ts","../node_modules/ol/CollectionEventType.js","../node_modules/ol/ObjectEventType.js","../node_modules/ol/obj.js","../node_modules/ol/events.js","../node_modules/ol/events/EventType.js","../node_modules/ol/Disposable.js","../node_modules/ol/array.js","../node_modules/ol/functions.js","../node_modules/ol/events/Event.js","../node_modules/ol/events/Target.js","../node_modules/ol/Observable.js","../node_modules/ol/util.js","../node_modules/ol/Object.js","../node_modules/ol/Collection.js","../node_modules/ol/MapEvent.js","../node_modules/ol/MapBrowserEvent.js","../node_modules/ol/MapBrowserEventType.js","../node_modules/ol/has.js","../node_modules/ol/pointer/EventType.js","../node_modules/ol/MapBrowserEventHandler.js","../node_modules/ol/MapEventType.js","../node_modules/ol/MapProperty.js","../node_modules/ol/TileState.js","../node_modules/ol/asserts.js","../node_modules/ol/structs/PriorityQueue.js","../node_modules/ol/TileQueue.js","../node_modules/ol/ViewHint.js","../node_modules/ol/ViewProperty.js","../node_modules/ol/math.js","../node_modules/ol/centerconstraint.js","../node_modules/ol/extent/Relationship.js","../node_modules/ol/extent.js","../node_modules/ol/coordinate.js","../node_modules/ol/easing.js","../node_modules/ol/sphere.js","../node_modules/ol/console.js","../node_modules/ol/proj/Units.js","../node_modules/ol/proj/Projection.js","../node_modules/ol/proj/epsg3857.js","../node_modules/ol/proj/epsg4326.js","../node_modules/ol/proj/projections.js","../node_modules/ol/proj/transforms.js","../node_modules/ol/proj/utm.js","../node_modules/ol/proj.js","../node_modules/ol/transform.js","../node_modules/ol/geom/flat/transform.js","../node_modules/ol/geom/Geometry.js","../node_modules/ol/geom/SimpleGeometry.js","../node_modules/ol/geom/flat/area.js","../node_modules/ol/geom/flat/closest.js","../node_modules/ol/geom/flat/deflate.js","../node_modules/ol/geom/flat/inflate.js","../node_modules/ol/geom/flat/contains.js","../node_modules/ol/geom/flat/segments.js","../node_modules/ol/geom/flat/intersectsextent.js","../node_modules/ol/geom/flat/simplify.js","../node_modules/ol/geom/LinearRing.js","../node_modules/ol/geom/Point.js","../node_modules/ol/geom/flat/interiorpoint.js","../node_modules/ol/geom/flat/reverse.js","../node_modules/ol/geom/flat/orient.js","../node_modules/ol/geom/Polygon.js","../node_modules/ol/resolutionconstraint.js","../node_modules/ol/rotationconstraint.js","../node_modules/ol/View.js","../node_modules/ol/css.js","../node_modules/ol/dom.js","../node_modules/ol/control/Control.js","../node_modules/ol/control/Attribution.js","../node_modules/ol/control/Rotate.js","../node_modules/ol/control/Zoom.js","../node_modules/ol/control/defaults.js","../node_modules/ol/Kinetic.js","../node_modules/ol/interaction/Property.js","../node_modules/ol/interaction/Interaction.js","../node_modules/ol/interaction/DoubleClickZoom.js","../node_modules/ol/events/condition.js","../node_modules/ol/interaction/Pointer.js","../node_modules/ol/interaction/DragPan.js","../node_modules/ol/interaction/DragRotate.js","../node_modules/ol/render/Box.js","../node_modules/ol/interaction/DragBox.js","../node_modules/ol/interaction/DragZoom.js","../node_modules/ol/events/Key.js","../node_modules/ol/interaction/KeyboardPan.js","../node_modules/ol/interaction/KeyboardZoom.js","../node_modules/ol/interaction/MouseWheelZoom.js","../node_modules/ol/interaction/PinchRotate.js","../node_modules/ol/interaction/PinchZoom.js","../node_modules/ol/interaction/defaults.js","../node_modules/ol/layer/Property.js","../node_modules/ol/layer/Base.js","../node_modules/ol/layer/Group.js","../node_modules/ol/render/EventType.js","../node_modules/ol/layer/Layer.js","../node_modules/quickselect/index.js","../node_modules/rbush/index.js","../node_modules/ol/color.js","../node_modules/ol/size.js","../node_modules/ol/expr/expression.js","../node_modules/ol/expr/cpu.js","../node_modules/ol/ImageState.js","../node_modules/ol/Image.js","../node_modules/ol/style/IconImageCache.js","../node_modules/ol/style/IconImage.js","../node_modules/ol/colorlike.js","../node_modules/ol/render/canvas.js","../node_modules/ol/style/Image.js","../node_modules/ol/style/RegularShape.js","../node_modules/ol/style/Circle.js","../node_modules/ol/style/Fill.js","../node_modules/ol/style/Icon.js","../node_modules/ol/style/Stroke.js","../node_modules/ol/style/Style.js","../node_modules/ol/style/Text.js","../node_modules/ol/render/canvas/style.js","../node_modules/ol/layer/BaseVector.js","../node_modules/ol/render/Event.js","../node_modules/ol/renderer/Map.js","../node_modules/ol/renderer/Composite.js","../node_modules/ol/Map.js","../node_modules/ol/Tile.js","../node_modules/ol/DataTile.js","../node_modules/ol/ImageTile.js","../node_modules/ol/TileRange.js","../node_modules/ol/reproj.js","../node_modules/ol/reproj/Triangulation.js","../node_modules/ol/reproj/common.js","../node_modules/ol/reproj/Tile.js","../node_modules/ol/structs/LRUCache.js","../node_modules/ol/tilecoord.js","../node_modules/ol/render/canvas/ZIndexContext.js","../node_modules/ol/renderer/Layer.js","../node_modules/ol/renderer/canvas/Layer.js","../node_modules/ol/renderer/canvas/TileLayer.js","../node_modules/ol/layer/TileProperty.js","../node_modules/ol/layer/BaseTile.js","../node_modules/ol/layer/Tile.js","../node_modules/ol/render/VectorContext.js","../node_modules/ol/render/canvas/Instruction.js","../node_modules/ol/render/canvas/Builder.js","../node_modules/ol/render/canvas/ImageBuilder.js","../node_modules/ol/render/canvas/LineStringBuilder.js","../node_modules/ol/render/canvas/PolygonBuilder.js","../node_modules/ol/geom/flat/clip.js","../node_modules/ol/geom/flat/linechunk.js","../node_modules/ol/geom/flat/straightchunk.js","../node_modules/ol/render/canvas/TextBuilder.js","../node_modules/ol/render/canvas/BuilderGroup.js","../node_modules/ol/geom/flat/length.js","../node_modules/ol/geom/flat/lineoffset.js","../node_modules/ol/geom/flat/textpath.js","../node_modules/ol/render/canvas/Executor.js","../node_modules/ol/render/canvas/ExecutorGroup.js","../node_modules/ol/render/canvas/Immediate.js","../node_modules/ol/render/canvas/hitdetect.js","../node_modules/ol/renderer/vector.js","../node_modules/ol/renderer/canvas/VectorLayer.js","../node_modules/ol/layer/Vector.js","../node_modules/ol/featureloader.js","../node_modules/ol/loadingstrategy.js","../node_modules/ol/Feature.js","../node_modules/ol/geom/flat/interpolate.js","../node_modules/ol/geom/LineString.js","../node_modules/ol/geom/MultiLineString.js","../node_modules/ol/geom/MultiPoint.js","../node_modules/ol/geom/flat/center.js","../node_modules/ol/geom/MultiPolygon.js","../node_modules/ol/render/Feature.js","../node_modules/ol/structs/RBush.js","../node_modules/ol/source/Source.js","../node_modules/ol/source/VectorEventType.js","../node_modules/ol/source/Vector.js","../node_modules/ol/tilegrid/TileGrid.js","../node_modules/ol/tilegrid.js","../node_modules/ol/uri.js","../node_modules/ol/tileurlfunction.js","../node_modules/ol/source/Tile.js","../node_modules/ol/source/TileEventType.js","../node_modules/ol/source/UrlTile.js","../node_modules/ol/source/TileImage.js","../node_modules/ol/source/XYZ.js","../node_modules/ol/source/OSM.js","../node_modules/ol/geom/GeometryCollection.js","../node_modules/ol/format/Feature.js","../node_modules/ol/format/JSONFeature.js","../node_modules/ol/format/GeoJSON.js","../src/client/MapCard.tsx","../src/client/meta.ts","../src/client/index.ts"],"sourcesContent":["/** UI copy for the map card, in the two locales the shell ships. */\n\nexport const zh: Record = {\n 'card.loading': '正在读取…',\n 'card.features': '{count} 个要素',\n 'card.truncated': '(已截断)',\n 'card.empty': '该图层没有可显示的几何要素',\n 'card.error': '读取失败',\n 'card.fields': '字段',\n 'card.attributes': '属性',\n 'card.close': '关闭',\n 'card.fit': '缩放到图层范围',\n 'card.basemap': '底图',\n 'card.basemap.osm': '街道图',\n 'card.basemap.none': '无底图',\n 'card.offline': '底图不可用(离线),仅显示矢量要素',\n}\n\nexport const en: Record = {\n 'card.loading': 'Reading…',\n 'card.features': '{count} feature(s)',\n 'card.truncated': ' (truncated)',\n 'card.empty': 'This layer has no renderable geometry',\n 'card.error': 'Read failed',\n 'card.fields': 'Fields',\n 'card.attributes': 'Attributes',\n 'card.close': 'Close',\n 'card.fit': 'Zoom to layer extent',\n 'card.basemap': 'Basemap',\n 'card.basemap.osm': 'Streets',\n 'card.basemap.none': 'No basemap',\n 'card.offline': 'Basemap unavailable (offline) — vector features only',\n}\n","/**\n * @module ol/CollectionEventType\n */\n\n/**\n * @enum {string}\n */\nexport default {\n /**\n * Triggered when an item is added to the collection.\n * @event module:ol/Collection.CollectionEvent#add\n * @api\n */\n ADD: 'add',\n /**\n * Triggered when an item is removed from the collection.\n * @event module:ol/Collection.CollectionEvent#remove\n * @api\n */\n REMOVE: 'remove',\n};\n","/**\n * @module ol/ObjectEventType\n */\n\n/**\n * @enum {string}\n */\nexport default {\n /**\n * Triggered when a property is changed.\n * @event module:ol/Object.ObjectEvent#propertychange\n * @api\n */\n PROPERTYCHANGE: 'propertychange',\n};\n\n/**\n * @typedef {'propertychange'} Types\n */\n","/**\n * @module ol/obj\n */\n\n/**\n * Removes all properties from an object.\n * @param {Object} object The object to clear.\n */\nexport function clear(object) {\n for (const property in object) {\n delete object[property];\n }\n}\n\n/**\n * Determine if an object has any properties.\n * @param {Object} object The object to check.\n * @return {boolean} The object is empty.\n */\nexport function isEmpty(object) {\n let property;\n for (property in object) {\n return false;\n }\n return !property;\n}\n","/**\n * @module ol/events\n */\nimport {clear} from './obj.js';\n\n/**\n * Key to use with {@link module:ol/Observable.unByKey}.\n * @typedef {Object} EventsKey\n * @property {ListenerFunction} listener Listener.\n * @property {import(\"./events/Target.js\").EventTargetLike} target Target.\n * @property {string} type Type.\n * @api\n */\n\n/**\n * Listener function. This function is called with an event object as argument.\n * When the function returns `false`, event propagation will stop.\n *\n * @typedef {function((Event|import(\"./events/Event.js\").default)): (void|boolean)} ListenerFunction\n * @api\n */\n\n/**\n * @typedef {Object} ListenerObject\n * @property {ListenerFunction} handleEvent HandleEvent listener function.\n */\n\n/**\n * @typedef {ListenerFunction|ListenerObject} Listener\n */\n\n/**\n * Registers an event listener on an event target. Inspired by\n * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html\n *\n * This function efficiently binds a `listener` to a `this` object, and returns\n * a key for use with {@link module:ol/events.unlistenByKey}.\n *\n * @param {import(\"./events/Target.js\").EventTargetLike} target Event target.\n * @param {string} type Event type.\n * @param {ListenerFunction} listener Listener.\n * @param {Object} [thisArg] Object referenced by the `this` keyword in the\n * listener. Default is the `target`.\n * @param {boolean} [once] If true, add the listener as one-off listener.\n * @return {EventsKey} Unique key for the listener.\n */\nexport function listen(target, type, listener, thisArg, once) {\n if (once) {\n const originalListener = listener;\n /**\n * @param {Event|import('./events/Event.js').default} event The event\n * @return {void|boolean} When the function returns `false`, event propagation will stop.\n * @this {typeof target}\n */\n listener = function (event) {\n target.removeEventListener(type, listener);\n return originalListener.call(thisArg ?? this, event);\n };\n } else if (thisArg && thisArg !== target) {\n listener = listener.bind(thisArg);\n }\n const eventsKey = {\n target: target,\n type: type,\n listener: listener,\n };\n target.addEventListener(type, listener);\n return eventsKey;\n}\n\n/**\n * Registers a one-off event listener on an event target. Inspired by\n * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html\n *\n * This function efficiently binds a `listener` as self-unregistering listener\n * to a `this` object, and returns a key for use with\n * {@link module:ol/events.unlistenByKey} in case the listener needs to be\n * unregistered before it is called.\n *\n * When {@link module:ol/events.listen} is called with the same arguments after this\n * function, the self-unregistering listener will be turned into a permanent\n * listener.\n *\n * @param {import(\"./events/Target.js\").EventTargetLike} target Event target.\n * @param {string} type Event type.\n * @param {ListenerFunction} listener Listener.\n * @param {Object} [thisArg] Object referenced by the `this` keyword in the\n * listener. Default is the `target`.\n * @return {EventsKey} Key for unlistenByKey.\n */\nexport function listenOnce(target, type, listener, thisArg) {\n return listen(target, type, listener, thisArg, true);\n}\n\n/**\n * Unregisters event listeners on an event target. Inspired by\n * https://google.github.io/closure-library/api/source/closure/goog/events/events.js.src.html\n *\n * The argument passed to this function is the key returned from\n * {@link module:ol/events.listen} or {@link module:ol/events.listenOnce}.\n *\n * @param {EventsKey} key The key.\n */\nexport function unlistenByKey(key) {\n if (key && key.target) {\n key.target.removeEventListener(key.type, key.listener);\n clear(key);\n }\n}\n","/**\n * @module ol/events/EventType\n */\n\n/**\n * @enum {string}\n * @const\n */\nexport default {\n /**\n * Generic change event. Triggered when the revision counter is increased.\n * @event module:ol/events/Event~BaseEvent#change\n * @api\n */\n CHANGE: 'change',\n\n /**\n * Generic error event. Triggered when an error occurs.\n * @event module:ol/events/Event~BaseEvent#error\n * @api\n */\n ERROR: 'error',\n\n BLUR: 'blur',\n CLEAR: 'clear',\n CONTEXTMENU: 'contextmenu',\n CLICK: 'click',\n DBLCLICK: 'dblclick',\n DRAGENTER: 'dragenter',\n DRAGOVER: 'dragover',\n DROP: 'drop',\n FOCUS: 'focus',\n KEYDOWN: 'keydown',\n KEYPRESS: 'keypress',\n LOAD: 'load',\n RESIZE: 'resize',\n TOUCHMOVE: 'touchmove',\n WHEEL: 'wheel',\n};\n","/**\n * @module ol/Disposable\n */\n\n/**\n * @classdesc\n * Objects that need to clean up after themselves.\n */\nclass Disposable {\n constructor() {\n /**\n * The object has already been disposed.\n * @type {boolean}\n * @protected\n */\n this.disposed = false;\n }\n\n /**\n * Clean up.\n */\n dispose() {\n if (!this.disposed) {\n this.disposed = true;\n this.disposeInternal();\n }\n }\n\n /**\n * Extension point for disposable objects.\n * @protected\n */\n disposeInternal() {}\n}\n\nexport default Disposable;\n","/**\n * @module ol/array\n */\n\n/**\n * Performs a binary search on the provided sorted list and returns the index of the item if found. If it can't be found it'll return -1.\n * https://github.com/darkskyapp/binary-search\n *\n * @param {Array<*>} haystack Items to search through.\n * @param {*} needle The item to look for.\n * @param {Function} [comparator] Comparator function.\n * @return {number} The index of the item if found, -1 if not.\n */\nexport function binarySearch(haystack, needle, comparator) {\n let mid, cmp;\n comparator = comparator || ascending;\n let low = 0;\n let high = haystack.length;\n let found = false;\n\n while (low < high) {\n /* Note that \"(low + high) >>> 1\" may overflow, and results in a typecast\n * to double (which gives the wrong results). */\n mid = low + ((high - low) >> 1);\n cmp = +comparator(haystack[mid], needle);\n\n if (cmp < 0.0) {\n /* Too low. */\n low = mid + 1;\n } else {\n /* Key found or too high */\n high = mid;\n found = !cmp;\n }\n }\n\n /* Key not found. */\n return found ? low : ~low;\n}\n\n/**\n * Compare function sorting arrays in ascending order. Safe to use for numeric values.\n * @param {*} a The first object to be compared.\n * @param {*} b The second object to be compared.\n * @return {number} A negative number, zero, or a positive number as the first\n * argument is less than, equal to, or greater than the second.\n */\nexport function ascending(a, b) {\n return a > b ? 1 : a < b ? -1 : 0;\n}\n\n/**\n * Compare function sorting arrays in descending order. Safe to use for numeric values.\n * @param {*} a The first object to be compared.\n * @param {*} b The second object to be compared.\n * @return {number} A negative number, zero, or a positive number as the first\n * argument is greater than, equal to, or less than the second.\n */\nexport function descending(a, b) {\n return a < b ? 1 : a > b ? -1 : 0;\n}\n\n/**\n * {@link module:ol/tilegrid/TileGrid~TileGrid#getZForResolution} can use a function\n * of this type to determine which nearest resolution to use.\n *\n * This function takes a `{number}` representing a value between two array entries,\n * a `{number}` representing the value of the nearest higher entry and\n * a `{number}` representing the value of the nearest lower entry\n * as arguments and returns a `{number}`. If a negative number or zero is returned\n * the lower value will be used, if a positive number is returned the higher value\n * will be used.\n * @typedef {function(number, number, number): number} NearestDirectionFunction\n * @api\n */\n\n/**\n * @param {Array} arr Array in descending order.\n * @param {number} target Target.\n * @param {number|NearestDirectionFunction} direction\n * 0 means return the nearest,\n * > 0 means return the largest nearest,\n * < 0 means return the smallest nearest.\n * @return {number} Index.\n */\nexport function linearFindNearest(arr, target, direction) {\n if (arr[0] <= target) {\n return 0;\n }\n\n const n = arr.length;\n if (target <= arr[n - 1]) {\n return n - 1;\n }\n\n if (typeof direction === 'function') {\n for (let i = 1; i < n; ++i) {\n const candidate = arr[i];\n if (candidate === target) {\n return i;\n }\n if (candidate < target) {\n if (direction(target, arr[i - 1], candidate) > 0) {\n return i - 1;\n }\n return i;\n }\n }\n return n - 1;\n }\n\n if (direction > 0) {\n for (let i = 1; i < n; ++i) {\n if (arr[i] < target) {\n return i - 1;\n }\n }\n return n - 1;\n }\n\n if (direction < 0) {\n for (let i = 1; i < n; ++i) {\n if (arr[i] <= target) {\n return i;\n }\n }\n return n - 1;\n }\n\n for (let i = 1; i < n; ++i) {\n if (arr[i] == target) {\n return i;\n }\n if (arr[i] < target) {\n if (arr[i - 1] - target < target - arr[i]) {\n return i - 1;\n }\n return i;\n }\n }\n return n - 1;\n}\n\n/**\n * @param {Array<*>} arr Array.\n * @param {number} begin Begin index.\n * @param {number} end End index.\n */\nexport function reverseSubArray(arr, begin, end) {\n while (begin < end) {\n const tmp = arr[begin];\n arr[begin] = arr[end];\n arr[end] = tmp;\n ++begin;\n --end;\n }\n}\n\n/**\n * @param {Array} arr The array to modify.\n * @param {!Array|VALUE} data The elements or arrays of elements to add to arr.\n * @template VALUE\n */\nexport function extend(arr, data) {\n const extension = Array.isArray(data) ? data : [data];\n const length = extension.length;\n for (let i = 0; i < length; i++) {\n arr[arr.length] = extension[i];\n }\n}\n\n/**\n * @param {Array} arr The array to modify.\n * @param {VALUE} obj The element to remove.\n * @template VALUE\n * @return {boolean} If the element was removed.\n */\nexport function remove(arr, obj) {\n const i = arr.indexOf(obj);\n const found = i > -1;\n if (found) {\n arr.splice(i, 1);\n }\n return found;\n}\n\n/**\n * @param {Array|Uint8ClampedArray} arr1 The first array to compare.\n * @param {Array|Uint8ClampedArray} arr2 The second array to compare.\n * @return {boolean} Whether the two arrays are equal.\n */\nexport function equals(arr1, arr2) {\n const len1 = arr1.length;\n if (len1 !== arr2.length) {\n return false;\n }\n for (let i = 0; i < len1; i++) {\n if (arr1[i] !== arr2[i]) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * Sort the passed array such that the relative order of equal elements is preserved.\n * See https://en.wikipedia.org/wiki/Sorting_algorithm#Stability for details.\n * @param {Array<*>} arr The array to sort (modifies original).\n * @param {!function(*, *): number} compareFnc Comparison function.\n * @api\n * @deprecated\n */\nexport function stableSort(arr, compareFnc) {\n const length = arr.length;\n const tmp = Array(arr.length);\n let i;\n for (i = 0; i < length; i++) {\n tmp[i] = {index: i, value: arr[i]};\n }\n tmp.sort(function (a, b) {\n return compareFnc(a.value, b.value) || a.index - b.index;\n });\n for (i = 0; i < arr.length; i++) {\n arr[i] = tmp[i].value;\n }\n}\n\n/**\n * @param {Array<*>} arr The array to test.\n * @param {Function} [func] Comparison function.\n * @param {boolean} [strict] Strictly sorted (default false).\n * @return {boolean} Return index.\n */\nexport function isSorted(arr, func, strict) {\n const compare = func || ascending;\n return arr.every(function (currentVal, index) {\n if (index === 0) {\n return true;\n }\n const res = compare(arr[index - 1], currentVal);\n return !(res > 0 || (strict && res === 0));\n });\n}\n","/**\n * @module ol/functions\n */\n\nimport {equals as arrayEquals} from './array.js';\n\n/**\n * Always returns true.\n * @return {boolean} true.\n */\nexport function TRUE() {\n return true;\n}\n\n/**\n * Always returns false.\n * @return {boolean} false.\n */\nexport function FALSE() {\n return false;\n}\n\n/**\n * A reusable function, used e.g. as a default for callbacks.\n *\n * @return {void} Nothing.\n */\nexport function VOID() {}\n\n/**\n * Wrap a function in another function that remembers the last return. If the\n * returned function is called twice in a row with the same arguments and the same\n * this object, it will return the value from the first call in the second call.\n *\n * @param {function(...any): ReturnType} fn The function to memoize.\n * @return {function(...any): ReturnType} The memoized function.\n * @template ReturnType\n */\nexport function memoizeOne(fn) {\n /** @type {ReturnType} */\n let lastResult;\n\n /** @type {Array|undefined} */\n let lastArgs;\n\n let lastThis;\n\n /**\n * @this {*} Only need to know if `this` changed, don't care what type\n * @return {ReturnType} Memoized value\n */\n return function () {\n const nextArgs = Array.prototype.slice.call(arguments);\n if (!lastArgs || this !== lastThis || !arrayEquals(nextArgs, lastArgs)) {\n lastThis = this;\n lastArgs = nextArgs;\n lastResult = fn.apply(this, arguments);\n }\n return lastResult;\n };\n}\n\n/**\n * @template T\n * @param {function(): (T | Promise)} getter A function that returns a value or a promise for a value.\n * @return {Promise} A promise for the value.\n */\nexport function toPromise(getter) {\n function promiseGetter() {\n let value;\n try {\n value = getter();\n } catch (err) {\n return Promise.reject(err);\n }\n if (value instanceof Promise) {\n return value;\n }\n return Promise.resolve(value);\n }\n return promiseGetter();\n}\n","/**\n * @module ol/events/Event\n */\n\n/**\n * @classdesc\n * Stripped down implementation of the W3C DOM Level 2 Event interface.\n * See https://www.w3.org/TR/DOM-Level-2-Events/events.html#Events-interface.\n *\n * This implementation only provides `type` and `target` properties, and\n * `stopPropagation` and `preventDefault` methods. It is meant as base class\n * for higher level events defined in the library, and works with\n * {@link module:ol/events/Target~Target}.\n */\nclass BaseEvent {\n /**\n * @param {string} type Type.\n */\n constructor(type) {\n /**\n * @type {boolean}\n */\n this.propagationStopped;\n\n /**\n * @type {boolean}\n */\n this.defaultPrevented;\n\n /**\n * The event type.\n * @type {string}\n * @api\n */\n this.type = type;\n\n /**\n * The event target.\n * @type {Object}\n * @api\n */\n this.target = null;\n }\n\n /**\n * Prevent default. This means that no emulated `click`, `singleclick` or `doubleclick` events\n * will be fired.\n * @api\n */\n preventDefault() {\n this.defaultPrevented = true;\n }\n\n /**\n * Stop event propagation.\n * @api\n */\n stopPropagation() {\n this.propagationStopped = true;\n }\n}\n\n/**\n * @param {Event|import(\"./Event.js\").default} evt Event\n */\nexport function stopPropagation(evt) {\n evt.stopPropagation();\n}\n\n/**\n * @param {Event|import(\"./Event.js\").default} evt Event\n */\nexport function preventDefault(evt) {\n evt.preventDefault();\n}\n\nexport default BaseEvent;\n","/**\n * @module ol/events/Target\n */\nimport Disposable from '../Disposable.js';\nimport {VOID} from '../functions.js';\nimport {clear} from '../obj.js';\nimport Event from './Event.js';\n\n/**\n * @typedef {EventTarget|Target} EventTargetLike\n */\n\n/**\n * @classdesc\n * A simplified implementation of the W3C DOM Level 2 EventTarget interface.\n * See https://www.w3.org/TR/2000/REC-DOM-Level-2-Events-20001113/events.html#Events-EventTarget.\n *\n * There are two important simplifications compared to the specification:\n *\n * 1. The handling of `useCapture` in `addEventListener` and\n * `removeEventListener`. There is no real capture model.\n * 2. The handling of `stopPropagation` and `preventDefault` on `dispatchEvent`.\n * There is no event target hierarchy. When a listener calls\n * `stopPropagation` or `preventDefault` on an event object, it means that no\n * more listeners after this one will be called. Same as when the listener\n * returns false.\n */\nclass Target extends Disposable {\n /**\n * @param {*} [target] Default event target for dispatched events.\n */\n constructor(target) {\n super();\n\n /**\n * @private\n * @type {*}\n */\n this.eventTarget_ = target;\n\n /**\n * @private\n * @type {Object|null}\n */\n this.pendingRemovals_ = null;\n\n /**\n * @private\n * @type {Object|null}\n */\n this.dispatching_ = null;\n\n /**\n * @private\n * @type {Object>|null}\n */\n this.listeners_ = null;\n }\n\n /**\n * @param {string} type Type.\n * @param {import(\"../events.js\").Listener} listener Listener.\n */\n addEventListener(type, listener) {\n if (!type || !listener) {\n return;\n }\n const listeners = this.listeners_ || (this.listeners_ = {});\n const listenersForType = listeners[type] || (listeners[type] = []);\n if (!listenersForType.includes(listener)) {\n listenersForType.push(listener);\n }\n }\n\n /**\n * Dispatches an event and calls all listeners listening for events\n * of this type. The event parameter can either be a string or an\n * Object with a `type` property.\n *\n * @param {import(\"./Event.js\").default|string} event Event object.\n * @return {boolean|undefined} `false` if anyone called preventDefault on the\n * event object or if any of the listeners returned false.\n * @api\n */\n dispatchEvent(event) {\n const isString = typeof event === 'string';\n const type = isString ? event : event.type;\n const listeners = this.listeners_ && this.listeners_[type];\n if (!listeners) {\n return;\n }\n\n const evt = isString ? new Event(event) : /** @type {Event} */ (event);\n if (!evt.target) {\n evt.target = this.eventTarget_ || this;\n }\n const dispatching = this.dispatching_ || (this.dispatching_ = {});\n const pendingRemovals =\n this.pendingRemovals_ || (this.pendingRemovals_ = {});\n if (!(type in dispatching)) {\n dispatching[type] = 0;\n pendingRemovals[type] = 0;\n }\n ++dispatching[type];\n let propagate;\n for (let i = 0, ii = listeners.length; i < ii; ++i) {\n if ('handleEvent' in listeners[i]) {\n propagate = /** @type {import(\"../events.js\").ListenerObject} */ (\n listeners[i]\n ).handleEvent(evt);\n } else {\n propagate = /** @type {import(\"../events.js\").ListenerFunction} */ (\n listeners[i]\n ).call(this, evt);\n }\n if (propagate === false || evt.propagationStopped) {\n propagate = false;\n break;\n }\n }\n if (--dispatching[type] === 0) {\n let pr = pendingRemovals[type];\n delete pendingRemovals[type];\n while (pr--) {\n this.removeEventListener(type, VOID);\n }\n delete dispatching[type];\n }\n return propagate;\n }\n\n /**\n * Clean up.\n * @override\n */\n disposeInternal() {\n this.listeners_ && clear(this.listeners_);\n }\n\n /**\n * Get the listeners for a specified event type. Listeners are returned in the\n * order that they will be called in.\n *\n * @param {string} type Type.\n * @return {Array|undefined} Listeners.\n */\n getListeners(type) {\n return (this.listeners_ && this.listeners_[type]) || undefined;\n }\n\n /**\n * @param {string} [type] Type. If not provided,\n * `true` will be returned if this event target has any listeners.\n * @return {boolean} Has listeners.\n */\n hasListener(type) {\n if (!this.listeners_) {\n return false;\n }\n return type\n ? type in this.listeners_\n : Object.keys(this.listeners_).length > 0;\n }\n\n /**\n * @param {string} type Type.\n * @param {import(\"../events.js\").Listener} listener Listener.\n */\n removeEventListener(type, listener) {\n if (!this.listeners_) {\n return;\n }\n const listeners = this.listeners_[type];\n if (!listeners) {\n return;\n }\n const index = listeners.indexOf(listener);\n if (index !== -1) {\n if (this.pendingRemovals_ && type in this.pendingRemovals_) {\n // make listener a no-op, and remove later in #dispatchEvent()\n listeners[index] = VOID;\n ++this.pendingRemovals_[type];\n } else {\n listeners.splice(index, 1);\n if (listeners.length === 0) {\n delete this.listeners_[type];\n }\n }\n }\n }\n}\n\nexport default Target;\n","/**\n * @module ol/Observable\n */\nimport {listen, listenOnce, unlistenByKey} from './events.js';\nimport EventType from './events/EventType.js';\nimport EventTarget from './events/Target.js';\n\n/***\n * @template {string} Type\n * @template {Event|import(\"./events/Event.js\").default} EventClass\n * @template Return\n * @typedef {(type: Type, listener: (event: EventClass) => ?) => Return} OnSignature\n */\n\n/***\n * @template {string} Type\n * @template Return\n * @typedef {(type: Type[], listener: (event: Event|import(\"./events/Event.js\").default) => ?) => Return extends void ? void : Return[]} CombinedOnSignature\n */\n\n/**\n * @typedef {'change'|'error'} EventTypes\n */\n\n/***\n * @template Return\n * @typedef {OnSignature & CombinedOnSignature} ObservableOnSignature\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * An event target providing convenient methods for listener registration\n * and unregistration. A generic `change` event is always available through\n * {@link module:ol/Observable~Observable#changed}.\n *\n * @fires import(\"./events/Event.js\").default\n * @api\n */\nclass Observable extends EventTarget {\n constructor() {\n super();\n\n this.on =\n /** @type {ObservableOnSignature} */ (\n this.onInternal\n );\n\n this.once =\n /** @type {ObservableOnSignature} */ (\n this.onceInternal\n );\n\n this.un = /** @type {ObservableOnSignature} */ (this.unInternal);\n\n /**\n * @private\n * @type {number}\n */\n this.revision_ = 0;\n }\n\n /**\n * Increases the revision counter and dispatches a 'change' event.\n * @api\n */\n changed() {\n ++this.revision_;\n this.dispatchEvent(EventType.CHANGE);\n }\n\n /**\n * Get the version number for this object. Each time the object is modified,\n * its version number will be incremented.\n * @return {number} Revision.\n * @api\n */\n getRevision() {\n return this.revision_;\n }\n\n /**\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event.js\").default)): ?} listener Listener.\n * @return {import(\"./events.js\").EventsKey|Array} Event key.\n * @protected\n */\n onInternal(type, listener) {\n if (Array.isArray(type)) {\n const len = type.length;\n const keys = new Array(len);\n for (let i = 0; i < len; ++i) {\n keys[i] = listen(this, type[i], listener);\n }\n return keys;\n }\n return listen(this, /** @type {string} */ (type), listener);\n }\n\n /**\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event.js\").default)): ?} listener Listener.\n * @return {import(\"./events.js\").EventsKey|Array} Event key.\n * @protected\n */\n onceInternal(type, listener) {\n let key;\n if (Array.isArray(type)) {\n const len = type.length;\n key = new Array(len);\n for (let i = 0; i < len; ++i) {\n key[i] = listenOnce(this, type[i], listener);\n }\n } else {\n key = listenOnce(this, /** @type {string} */ (type), listener);\n }\n /** @type {Object} */ (listener).ol_key = key;\n return key;\n }\n\n /**\n * Unlisten for a certain type of event.\n * @param {string|Array} type Type.\n * @param {function((Event|import(\"./events/Event.js\").default)): ?} listener Listener.\n * @protected\n */\n unInternal(type, listener) {\n const key = /** @type {Object} */ (listener).ol_key;\n if (key) {\n unByKey(key);\n } else if (Array.isArray(type)) {\n for (let i = 0, ii = type.length; i < ii; ++i) {\n this.removeEventListener(type[i], listener);\n }\n } else {\n this.removeEventListener(type, listener);\n }\n }\n}\n\n/**\n * Listen for a certain type of event.\n * @function\n * @param {string|Array} type The event type or array of event types.\n * @param {function((Event|import(\"./events/Event.js\").default)): ?} listener The listener function.\n * @return {import(\"./events.js\").EventsKey|Array} Unique key for the listener. If\n * called with an array of event types as the first argument, the return\n * will be an array of keys.\n * @api\n */\nObservable.prototype.on;\n\n/**\n * Listen once for a certain type of event.\n * @function\n * @param {string|Array} type The event type or array of event types.\n * @param {function((Event|import(\"./events/Event.js\").default)): ?} listener The listener function.\n * @return {import(\"./events.js\").EventsKey|Array} Unique key for the listener. If\n * called with an array of event types as the first argument, the return\n * will be an array of keys.\n * @api\n */\nObservable.prototype.once;\n\n/**\n * Unlisten for a certain type of event.\n * @function\n * @param {string|Array} type The event type or array of event types.\n * @param {function((Event|import(\"./events/Event.js\").default)): ?} listener The listener function.\n * @api\n */\nObservable.prototype.un;\n\n/**\n * Removes an event listener using the key returned by `on()` or `once()`.\n * @param {import(\"./events.js\").EventsKey|Array} key The key returned by `on()`\n * or `once()` (or an array of keys).\n * @api\n */\nexport function unByKey(key) {\n if (Array.isArray(key)) {\n for (let i = 0, ii = key.length; i < ii; ++i) {\n unlistenByKey(key[i]);\n }\n } else {\n unlistenByKey(/** @type {import(\"./events.js\").EventsKey} */ (key));\n }\n}\n\nexport default Observable;\n","/**\n * @module ol/util\n */\n\n/**\n * @return {never} Any return.\n */\nexport function abstract() {\n throw new Error('Unimplemented abstract method.');\n}\n\n/**\n * Counter for getUid.\n * @type {number}\n * @private\n */\nlet uidCounter_ = 0;\n\n/**\n * Gets a unique ID for an object. This mutates the object so that further calls\n * with the same object as a parameter returns the same value. Unique IDs are generated\n * as a strictly increasing sequence. Adapted from goog.getUid.\n *\n * @param {Object} obj The object to get the unique ID for.\n * @return {string} The unique ID for the object.\n * @api\n */\nexport function getUid(obj) {\n return obj.ol_uid || (obj.ol_uid = String(++uidCounter_));\n}\n\n/**\n * OpenLayers version.\n * @type {string}\n */\nexport const VERSION = '10.10.0';\n","/**\n * @module ol/Object\n */\nimport ObjectEventType from './ObjectEventType.js';\nimport Observable from './Observable.js';\nimport Event from './events/Event.js';\nimport {isEmpty} from './obj.js';\nimport {getUid} from './util.js';\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/Object~BaseObject} instances are instances of this type.\n */\nexport class ObjectEvent extends Event {\n /**\n * @param {string} type The event type.\n * @param {string} key The property name.\n * @param {*} oldValue The old value for `key`.\n */\n constructor(type, key, oldValue) {\n super(type);\n\n /**\n * The name of the property whose value is changing.\n * @type {string}\n * @api\n */\n this.key = key;\n\n /**\n * The old value. To get the new value use `e.target.get(e.key)` where\n * `e` is the event object.\n * @type {*}\n * @api\n */\n this.oldValue = oldValue;\n }\n}\n\n/***\n * @template Return\n * @typedef {import(\"./Observable.js\").OnSignature &\n * import(\"./Observable.js\").OnSignature &\n * import(\"./Observable.js\").CombinedOnSignature} ObjectOnSignature\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * Most non-trivial classes inherit from this.\n *\n * This extends {@link module:ol/Observable~Observable} with observable\n * properties, where each property is observable as well as the object as a\n * whole.\n *\n * Classes that inherit from this have pre-defined properties, to which you can\n * add your owns. The pre-defined properties are listed in this documentation as\n * 'Observable Properties', and have their own accessors; for example,\n * {@link module:ol/Map~Map} has a `target` property, accessed with\n * `getTarget()` and changed with `setTarget()`. Not all properties are however\n * settable. There are also general-purpose accessors `get()` and `set()`. For\n * example, `get('target')` is equivalent to `getTarget()`.\n *\n * The `set` accessors trigger a change event, and you can monitor this by\n * registering a listener. For example, {@link module:ol/View~View} has a\n * `center` property, so `view.on('change:center', function(evt) {...});` would\n * call the function whenever the value of the center property changes. Within\n * the function, `evt.target` would be the view, so `evt.target.getCenter()`\n * would return the new center.\n *\n * You can add your own observable properties with\n * `object.set('prop', 'value')`, and retrieve that with `object.get('prop')`.\n * You can listen for changes on that property value with\n * `object.on('change:prop', listener)`. You can get a list of all\n * properties with {@link module:ol/Object~BaseObject#getProperties}.\n *\n * Note that the observable properties are separate from standard JS properties.\n * You can, for example, give your map object a title with\n * `map.title='New title'` and with `map.set('title', 'Another title')`. The\n * first will be a `hasOwnProperty`; the second will appear in\n * `getProperties()`. Only the second is observable.\n *\n * Properties can be deleted by using the unset method. E.g.\n * object.unset('foo').\n *\n * @fires ObjectEvent\n * @template {Object} [Properties=Object]\n * @api\n */\nclass BaseObject extends Observable {\n /**\n * @param {NoInfer} [values] An object with key-value pairs.\n */\n constructor(values) {\n super();\n\n /***\n * @type {ObjectOnSignature}\n */\n this.on;\n\n /***\n * @type {ObjectOnSignature}\n */\n this.once;\n\n /***\n * @type {ObjectOnSignature}\n */\n this.un;\n\n // Call {@link module:ol/util.getUid} to ensure that the order of objects' ids is\n // the same as the order in which they were created. This also helps to\n // ensure that object properties are always added in the same order, which\n // helps many JavaScript engines generate faster code.\n getUid(this);\n\n /**\n * @private\n * @type {Partial>|null}\n */\n this.values_ = null;\n\n if (values !== undefined) {\n this.setProperties(values);\n }\n }\n\n /**\n * Gets a value.\n * @param {string} key Key name.\n * @return {*} Value.\n * @api\n */\n get(key) {\n let value;\n if (this.values_ && this.values_.hasOwnProperty(key)) {\n value = this.values_[key];\n }\n return value;\n }\n\n /**\n * Get a list of object property names.\n * @return {Array} List of property names.\n * @api\n */\n getKeys() {\n return (this.values_ && Object.keys(this.values_)) || [];\n }\n\n /**\n * Get an object of all property names and values.\n * @return {NoInfer} Object.\n * @api\n */\n getProperties() {\n return /** @type {NoInfer} */ (\n (this.values_ && Object.assign({}, this.values_)) || {}\n );\n }\n\n /**\n * Get an object of all property names and values.\n * @return {Partial>?} Object.\n */\n getPropertiesInternal() {\n return this.values_;\n }\n\n /**\n * @return {boolean} The object has properties.\n */\n hasProperties() {\n return !!this.values_;\n }\n\n /**\n * @param {string} key Key name.\n * @param {*} oldValue Old value.\n */\n notify(key, oldValue) {\n let eventType;\n eventType = `change:${key}`;\n if (this.hasListener(eventType)) {\n this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));\n }\n eventType = ObjectEventType.PROPERTYCHANGE;\n if (this.hasListener(eventType)) {\n this.dispatchEvent(new ObjectEvent(eventType, key, oldValue));\n }\n }\n\n /**\n * @param {string} key Key name.\n * @param {import(\"./events.js\").Listener} listener Listener.\n */\n addChangeListener(key, listener) {\n this.addEventListener(`change:${key}`, listener);\n }\n\n /**\n * @param {string} key Key name.\n * @param {import(\"./events.js\").Listener} listener Listener.\n */\n removeChangeListener(key, listener) {\n this.removeEventListener(`change:${key}`, listener);\n }\n\n /**\n * Sets a value.\n * @param {string} key Key name.\n * @param {*} value Value.\n * @param {boolean} [silent] Update without triggering an event.\n * @api\n */\n set(key, value, silent) {\n const values = this.values_ || (this.values_ = {});\n if (silent) {\n values[key] = value;\n } else {\n const oldValue = values[key];\n values[key] = value;\n if (oldValue !== value) {\n this.notify(key, oldValue);\n }\n }\n }\n\n /**\n * Sets a collection of key-value pairs. Note that this changes any existing\n * properties and adds new ones (it does not remove any existing properties).\n * @param {Partial>} values Values.\n * @param {boolean} [silent] Update without triggering an event.\n * @api\n */\n setProperties(values, silent) {\n for (const key in values) {\n this.set(key, values[key], silent);\n }\n }\n\n /**\n * Apply any properties from another object without triggering events.\n * @param {BaseObject} source The source object.\n * @protected\n */\n applyProperties(source) {\n if (!source.values_) {\n return;\n }\n Object.assign(this.values_ || (this.values_ = {}), source.values_);\n }\n\n /**\n * Unsets a property.\n * @param {string} key Key name.\n * @param {boolean} [silent] Unset without triggering an event.\n * @api\n */\n unset(key, silent) {\n if (this.values_ && key in this.values_) {\n const oldValue = this.values_[key];\n delete this.values_[key];\n if (isEmpty(this.values_)) {\n this.values_ = null;\n }\n if (!silent) {\n this.notify(key, oldValue);\n }\n }\n }\n}\n\nexport default BaseObject;\n","/**\n * @module ol/Collection\n */\nimport CollectionEventType from './CollectionEventType.js';\nimport BaseObject from './Object.js';\nimport Event from './events/Event.js';\n\n/**\n * @enum {string}\n * @private\n */\nconst Property = {\n LENGTH: 'length',\n};\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/Collection~Collection} instances are instances of this\n * type.\n * @template T\n */\nexport class CollectionEvent extends Event {\n /**\n * @param {import(\"./CollectionEventType.js\").default} type Type.\n * @param {T} element Element.\n * @param {number} index The index of the added or removed element.\n */\n constructor(type, element, index) {\n super(type);\n\n /**\n * The element that is added to or removed from the collection.\n * @type {T}\n * @api\n */\n this.element = element;\n\n /**\n * The index of the added or removed element.\n * @type {number}\n * @api\n */\n this.index = index;\n }\n}\n\n/***\n * @template T\n * @template Return\n * @typedef {import(\"./Observable.js\").OnSignature &\n * import(\"./Observable.js\").OnSignature &\n * import(\"./Observable.js\").OnSignature<'add'|'remove', CollectionEvent, Return> &\n * import(\"./Observable.js\").CombinedOnSignature} CollectionOnSignature\n */\n\n/**\n * @typedef {Object} Options\n * @property {boolean} [unique=false] Disallow the same item from being added to\n * the collection twice.\n */\n\n/**\n * @classdesc\n * An expanded version of standard JS Array, adding convenience methods for\n * manipulation. Add and remove changes to the Collection trigger a Collection\n * event. Note that this does not cover changes to the objects _within_ the\n * Collection; they trigger events on the appropriate object, not on the\n * Collection as a whole.\n *\n * @fires CollectionEvent\n *\n * @template T\n * @api\n */\nclass Collection extends BaseObject {\n /**\n * @param {Array} [array] Array.\n * @param {Options} [options] Collection options.\n */\n constructor(array, options) {\n super();\n\n /***\n * @type {CollectionOnSignature}\n */\n this.on;\n\n /***\n * @type {CollectionOnSignature}\n */\n this.once;\n\n /***\n * @type {CollectionOnSignature}\n */\n this.un;\n\n options = options || {};\n\n /**\n * @private\n * @type {boolean}\n */\n this.unique_ = !!options.unique;\n\n /**\n * @private\n * @type {!Array}\n */\n this.array_ = array ?? [];\n\n if (this.unique_) {\n for (let i = 1, ii = this.array_.length; i < ii; ++i) {\n this.assertUnique_(this.array_[i], i);\n }\n }\n\n this.updateLength_();\n }\n\n /**\n * Remove all elements from the collection.\n * @api\n */\n clear() {\n while (this.getLength() > 0) {\n this.pop();\n }\n }\n\n /**\n * Add elements to the collection. This pushes each item in the provided array\n * to the end of the collection.\n * @param {!Array} arr Array.\n * @return {Collection} This collection.\n * @api\n */\n extend(arr) {\n for (let i = 0, ii = arr.length; i < ii; ++i) {\n this.push(arr[i]);\n }\n return this;\n }\n\n /**\n * Iterate over each element, calling the provided callback.\n * @param {function(T, number, Array): *} f The function to call\n * for every element. This function takes 3 arguments (the element, the\n * index and the array). The return value is ignored.\n * @api\n */\n forEach(f) {\n const array = this.array_;\n for (let i = 0, ii = array.length; i < ii; ++i) {\n f(array[i], i, array);\n }\n }\n\n /**\n * Get a reference to the underlying Array object. Warning: if the array\n * is mutated, no events will be dispatched by the collection, and the\n * collection's \"length\" property won't be in sync with the actual length\n * of the array.\n * @return {!Array} Array.\n * @api\n */\n getArray() {\n return this.array_;\n }\n\n /**\n * Get the element at the provided index.\n * @param {number} index Index.\n * @return {T} Element.\n * @api\n */\n item(index) {\n return this.array_[index];\n }\n\n /**\n * Get the length of this collection.\n * @return {number} The length of the array.\n * @observable\n * @api\n */\n getLength() {\n return this.get(Property.LENGTH);\n }\n\n /**\n * Insert an element at the provided index.\n * @param {number} index Index.\n * @param {T} elem Element.\n * @api\n */\n insertAt(index, elem) {\n if (index < 0 || index > this.getLength()) {\n throw new Error('Index out of bounds: ' + index);\n }\n if (this.unique_) {\n this.assertUnique_(elem);\n }\n this.array_.splice(index, 0, elem);\n this.updateLength_();\n this.dispatchEvent(\n new CollectionEvent(CollectionEventType.ADD, elem, index),\n );\n }\n\n /**\n * Remove the last element of the collection and return it.\n * Return `undefined` if the collection is empty.\n * @return {T|undefined} Element.\n * @api\n */\n pop() {\n return this.removeAt(this.getLength() - 1);\n }\n\n /**\n * Insert the provided element at the end of the collection.\n * @param {T} elem Element.\n * @return {number} New length of the collection.\n * @api\n */\n push(elem) {\n const n = this.getLength();\n this.insertAt(n, elem);\n return this.getLength();\n }\n\n /**\n * Remove the first occurrence of an element from the collection.\n * @param {T} elem Element.\n * @return {T|undefined} The removed element or undefined if none found.\n * @api\n */\n remove(elem) {\n const arr = this.array_;\n for (let i = 0, ii = arr.length; i < ii; ++i) {\n if (arr[i] === elem) {\n return this.removeAt(i);\n }\n }\n return undefined;\n }\n\n /**\n * Remove the element at the provided index and return it.\n * Return `undefined` if the collection does not contain this index.\n * @param {number} index Index.\n * @return {T|undefined} Value.\n * @api\n */\n removeAt(index) {\n if (index < 0 || index >= this.getLength()) {\n return undefined;\n }\n const prev = this.array_[index];\n this.array_.splice(index, 1);\n this.updateLength_();\n this.dispatchEvent(\n /** @type {CollectionEvent} */ (\n new CollectionEvent(CollectionEventType.REMOVE, prev, index)\n ),\n );\n return prev;\n }\n\n /**\n * Set the element at the provided index.\n * @param {number} index Index.\n * @param {T} elem Element.\n * @api\n */\n setAt(index, elem) {\n const n = this.getLength();\n if (index >= n) {\n this.insertAt(index, elem);\n return;\n }\n if (index < 0) {\n throw new Error('Index out of bounds: ' + index);\n }\n if (this.unique_) {\n this.assertUnique_(elem, index);\n }\n const prev = this.array_[index];\n this.array_[index] = elem;\n this.dispatchEvent(\n /** @type {CollectionEvent} */ (\n new CollectionEvent(CollectionEventType.REMOVE, prev, index)\n ),\n );\n this.dispatchEvent(\n /** @type {CollectionEvent} */ (\n new CollectionEvent(CollectionEventType.ADD, elem, index)\n ),\n );\n }\n\n /**\n * @private\n */\n updateLength_() {\n this.set(Property.LENGTH, this.array_.length);\n }\n\n /**\n * @private\n * @param {T} elem Element.\n * @param {number} [except] Optional index to ignore.\n */\n assertUnique_(elem, except) {\n const array = this.array_;\n for (let i = 0, ii = array.length; i < ii; ++i) {\n if (array[i] === elem && i !== except) {\n throw new Error('Duplicate item added to a unique collection');\n }\n }\n }\n}\n\nexport default Collection;\n","/**\n * @module ol/MapEvent\n */\nimport Event from './events/Event.js';\n\n/**\n * @classdesc\n * Events emitted as map events are instances of this type.\n * See {@link module:ol/Map~Map} for which events trigger a map event.\n */\nclass MapEvent extends Event {\n /**\n * @param {string} type Event type.\n * @param {import(\"./Map.js\").default} map Map.\n * @param {?import(\"./Map.js\").FrameState} [frameState] Frame state.\n */\n constructor(type, map, frameState) {\n super(type);\n\n /**\n * The map where the event occurred.\n * @type {import(\"./Map.js\").default}\n * @api\n */\n this.map = map;\n\n /**\n * The frame state at the time of the event.\n * @type {?import(\"./Map.js\").FrameState}\n * @api\n */\n this.frameState = frameState !== undefined ? frameState : null;\n }\n}\n\nexport default MapEvent;\n","/**\n * @module ol/MapBrowserEvent\n */\nimport MapEvent from './MapEvent.js';\n\n/**\n * @classdesc\n * Events emitted as map browser events are instances of this type.\n * See {@link module:ol/Map~Map} for which events trigger a map browser event.\n * @template {PointerEvent|KeyboardEvent|WheelEvent} [EVENT=PointerEvent|KeyboardEvent|WheelEvent]\n */\nclass MapBrowserEvent extends MapEvent {\n /**\n * @param {string} type Event type.\n * @param {import(\"./Map.js\").default} map Map.\n * @param {EVENT} originalEvent Original event.\n * @param {boolean} [dragging] Is the map currently being dragged?\n * @param {import(\"./Map.js\").FrameState} [frameState] Frame state.\n * @param {Array} [activePointers] Active pointers.\n */\n constructor(type, map, originalEvent, dragging, frameState, activePointers) {\n super(type, map, frameState);\n\n /**\n * The original browser event.\n * @const\n * @type {EVENT}\n * @api\n */\n this.originalEvent = originalEvent;\n\n /**\n * The map pixel relative to the viewport corresponding to the original browser event.\n * @type {?import(\"./pixel.js\").Pixel}\n * @private\n */\n this.pixel_ = null;\n\n /**\n * The coordinate in the user projection corresponding to the original browser event.\n * @type {?import(\"./coordinate.js\").Coordinate}\n * @private\n */\n this.coordinate_ = null;\n\n /**\n * Indicates if the map is currently being dragged. Only set for\n * `POINTERDRAG` and `POINTERMOVE` events. Default is `false`.\n *\n * @type {boolean}\n * @api\n */\n this.dragging = dragging !== undefined ? dragging : false;\n\n /**\n * @type {Array|undefined}\n */\n this.activePointers = activePointers;\n }\n\n /**\n * The map pixel relative to the viewport corresponding to the original event.\n * @type {import(\"./pixel.js\").Pixel}\n * @api\n */\n get pixel() {\n if (!this.pixel_) {\n this.pixel_ = this.map.getEventPixel(this.originalEvent);\n }\n return this.pixel_;\n }\n set pixel(pixel) {\n this.pixel_ = pixel;\n }\n\n /**\n * The coordinate corresponding to the original browser event. This will be in the user\n * projection if one is set. Otherwise it will be in the view projection.\n * @type {import(\"./coordinate.js\").Coordinate}\n * @api\n */\n get coordinate() {\n if (!this.coordinate_) {\n this.coordinate_ = this.map.getCoordinateFromPixel(this.pixel);\n }\n return this.coordinate_;\n }\n set coordinate(coordinate) {\n this.coordinate_ = coordinate;\n }\n\n /**\n * Prevents the default browser action.\n * See https://developer.mozilla.org/en-US/docs/Web/API/event.preventDefault.\n * @api\n * @override\n */\n preventDefault() {\n super.preventDefault();\n if ('preventDefault' in this.originalEvent) {\n /** @type {UIEvent} */ (this.originalEvent).preventDefault();\n }\n }\n\n /**\n * Prevents further propagation of the current event.\n * See https://developer.mozilla.org/en-US/docs/Web/API/event.stopPropagation.\n * @api\n * @override\n */\n stopPropagation() {\n super.stopPropagation();\n if ('stopPropagation' in this.originalEvent) {\n /** @type {UIEvent} */ (this.originalEvent).stopPropagation();\n }\n }\n}\n\nexport default MapBrowserEvent;\n","/**\n * @module ol/MapBrowserEventType\n */\nimport EventType from './events/EventType.js';\n\n/**\n * Constants for event names.\n * @enum {string}\n */\nexport default {\n /**\n * A true single click with no dragging and no double click. Note that this\n * event is delayed by 250 ms to ensure that it is not a double click.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#singleclick\n * @api\n */\n SINGLECLICK: 'singleclick',\n\n /**\n * A click with no dragging. A double click will fire two of this.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#click\n * @api\n */\n CLICK: EventType.CLICK,\n\n /**\n * A true double click, with no dragging.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#dblclick\n * @api\n */\n DBLCLICK: EventType.DBLCLICK,\n\n /**\n * Triggered when a pointer is dragged.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointerdrag\n * @api\n */\n POINTERDRAG: 'pointerdrag',\n\n /**\n * Triggered when a pointer is moved. Note that on touch devices this is\n * triggered when the map is panned, so is not the same as mousemove.\n * @event module:ol/MapBrowserEvent~MapBrowserEvent#pointermove\n * @api\n */\n POINTERMOVE: 'pointermove',\n\n POINTERDOWN: 'pointerdown',\n POINTERUP: 'pointerup',\n POINTEROVER: 'pointerover',\n POINTEROUT: 'pointerout',\n POINTERENTER: 'pointerenter',\n POINTERLEAVE: 'pointerleave',\n POINTERCANCEL: 'pointercancel',\n};\n\n/***\n * @typedef {'singleclick'|'click'|'dblclick'|'pointerdrag'|'pointermove'} Types\n */\n","/**\n * @module ol/has\n */\n\nconst ua =\n typeof navigator !== 'undefined' && typeof navigator.userAgent !== 'undefined'\n ? navigator.userAgent.toLowerCase()\n : '';\n\n/**\n * User agent string says we are dealing with Safari as browser.\n * @type {boolean}\n */\nexport const SAFARI = ua.includes('safari') && !ua.includes('chrom');\n\n/**\n * https://bugs.webkit.org/show_bug.cgi?id=237906\n * @type {boolean}\n */\nexport const SAFARI_BUG_237906 =\n SAFARI &&\n (ua.includes('version/15.4') ||\n /cpu (os|iphone os) 15_4 like mac os x/.test(ua));\n\n/**\n * User agent string says we are dealing with a WebKit engine.\n * @type {boolean}\n */\nexport const WEBKIT = ua.includes('webkit') && !ua.includes('edge');\n\n/**\n * User agent string says we are dealing with a Mac as platform.\n * @type {boolean}\n */\nexport const MAC = ua.includes('macintosh');\n\n/**\n * The ratio between physical pixels and device-independent pixels\n * (dips) on the device (`window.devicePixelRatio`).\n * @const\n * @type {number}\n * @api\n */\nexport const DEVICE_PIXEL_RATIO =\n typeof devicePixelRatio !== 'undefined' ? devicePixelRatio : 1;\n\n/**\n * The execution context is a worker with OffscreenCanvas available.\n * @const\n * @type {boolean}\n */\nexport const WORKER_OFFSCREEN_CANVAS =\n typeof WorkerGlobalScope !== 'undefined' &&\n typeof OffscreenCanvas !== 'undefined' &&\n self instanceof WorkerGlobalScope; //eslint-disable-line\n\n/**\n * Image.prototype.decode() is supported.\n * @type {boolean}\n */\nexport const IMAGE_DECODE =\n typeof Image !== 'undefined' && Image.prototype.decode;\n\n/**\n * createImageBitmap() is supported.\n * @type {boolean}\n */\nexport const CREATE_IMAGE_BITMAP = typeof createImageBitmap === 'function';\n\n/**\n * @type {boolean}\n */\nexport const PASSIVE_EVENT_LISTENERS = (function () {\n let passive = false;\n try {\n const options = Object.defineProperty({}, 'passive', {\n get: function () {\n passive = true;\n },\n });\n\n // @ts-ignore Ignore invalid event type '_'\n window.addEventListener('_', null, options);\n // @ts-ignore Ignore invalid event type '_'\n window.removeEventListener('_', null, options);\n } catch {\n // passive not supported\n }\n return passive;\n})();\n","/**\n * @module ol/pointer/EventType\n */\n\n/**\n * Constants for event names.\n * @enum {string}\n */\nexport default {\n POINTERMOVE: 'pointermove',\n POINTERDOWN: 'pointerdown',\n POINTERUP: 'pointerup',\n POINTEROVER: 'pointerover',\n POINTEROUT: 'pointerout',\n POINTERENTER: 'pointerenter',\n POINTERLEAVE: 'pointerleave',\n POINTERCANCEL: 'pointercancel',\n};\n","/**\n * @module ol/MapBrowserEventHandler\n */\n\nimport MapBrowserEvent from './MapBrowserEvent.js';\nimport MapBrowserEventType from './MapBrowserEventType.js';\nimport {listen, unlistenByKey} from './events.js';\nimport EventType from './events/EventType.js';\nimport Target from './events/Target.js';\nimport {PASSIVE_EVENT_LISTENERS} from './has.js';\nimport PointerEventType from './pointer/EventType.js';\n\nclass MapBrowserEventHandler extends Target {\n /**\n * @param {import(\"./Map.js\").default} map The map with the viewport to listen to events on.\n * @param {number} [moveTolerance] The minimal distance the pointer must travel to trigger a move.\n */\n constructor(map, moveTolerance) {\n super(map);\n\n /**\n * This is the element that we will listen to the real events on.\n * @type {import(\"./Map.js\").default}\n * @private\n */\n this.map_ = map;\n\n /**\n * @type {ReturnType}\n * @private\n */\n this.clickTimeoutId_;\n\n /**\n * Emulate dblclick and singleclick. Will be true when only one pointer is active.\n * @type {boolean}\n */\n this.emulateClicks_ = false;\n\n /**\n * @type {boolean}\n * @private\n */\n this.dragging_ = false;\n\n /**\n * @type {!Array}\n * @private\n */\n this.dragListenerKeys_ = [];\n\n /**\n * @type {number}\n * @private\n */\n this.moveTolerance_ = moveTolerance === undefined ? 1 : moveTolerance;\n\n /**\n * The most recent \"down\" type event (or null if none have occurred).\n * Set on pointerdown.\n * @type {PointerEvent|null}\n * @private\n */\n this.down_ = null;\n\n const element = this.map_.getViewport();\n\n /**\n * @type {Array}\n * @private\n */\n this.activePointers_ = [];\n\n /**\n * @type {!Object}\n * @private\n */\n this.trackedTouches_ = {};\n\n /**\n * @private\n */\n this.element_ = element;\n\n /**\n * @type {?import(\"./events.js\").EventsKey}\n * @private\n */\n this.pointerdownListenerKey_ = listen(\n element,\n PointerEventType.POINTERDOWN,\n this.handlePointerDown_,\n this,\n );\n\n /**\n * @type {PointerEvent}\n * @private\n */\n this.originalPointerMoveEvent_;\n\n /**\n * @type {?import(\"./events.js\").EventsKey}\n * @private\n */\n this.relayedListenerKey_ = listen(\n element,\n PointerEventType.POINTERMOVE,\n this.relayMoveEvent_,\n this,\n );\n\n /**\n * @private\n */\n this.boundHandleTouchMove_ = this.handleTouchMove_.bind(this);\n\n this.element_.addEventListener(\n EventType.TOUCHMOVE,\n this.boundHandleTouchMove_,\n PASSIVE_EVENT_LISTENERS ? {passive: false} : false,\n );\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n emulateClick_(pointerEvent) {\n let newEvent = new MapBrowserEvent(\n MapBrowserEventType.CLICK,\n this.map_,\n pointerEvent,\n );\n this.dispatchEvent(newEvent);\n if (this.clickTimeoutId_ !== undefined) {\n // double-click\n clearTimeout(this.clickTimeoutId_);\n this.clickTimeoutId_ = undefined;\n newEvent = new MapBrowserEvent(\n MapBrowserEventType.DBLCLICK,\n this.map_,\n pointerEvent,\n );\n this.dispatchEvent(newEvent);\n } else {\n // click\n this.clickTimeoutId_ = setTimeout(() => {\n this.clickTimeoutId_ = undefined;\n const newEvent = new MapBrowserEvent(\n MapBrowserEventType.SINGLECLICK,\n this.map_,\n pointerEvent,\n );\n this.dispatchEvent(newEvent);\n }, 250);\n }\n }\n\n /**\n * Keeps track on how many pointers are currently active.\n *\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n updateActivePointers_(pointerEvent) {\n const event = pointerEvent;\n const id = event.pointerId;\n\n if (\n event.type == MapBrowserEventType.POINTERUP ||\n event.type == MapBrowserEventType.POINTERCANCEL\n ) {\n delete this.trackedTouches_[id];\n for (const pointerId in this.trackedTouches_) {\n if (this.trackedTouches_[pointerId].target !== event.target) {\n // Some platforms assign a new pointerId when the target changes.\n // If this happens, delete one tracked pointer. If there is more\n // than one tracked pointer for the old target, it will be cleared\n // by subsequent POINTERUP events from other pointers.\n delete this.trackedTouches_[pointerId];\n break;\n }\n }\n } else if (\n event.type == MapBrowserEventType.POINTERDOWN ||\n event.type == MapBrowserEventType.POINTERMOVE\n ) {\n this.trackedTouches_[id] = event;\n }\n this.activePointers_ = Object.values(this.trackedTouches_);\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerUp_(pointerEvent) {\n this.updateActivePointers_(pointerEvent);\n const newEvent = new MapBrowserEvent(\n MapBrowserEventType.POINTERUP,\n this.map_,\n pointerEvent,\n undefined,\n undefined,\n this.activePointers_,\n );\n this.dispatchEvent(newEvent);\n\n // We emulate click events on left mouse button click, touch contact, and pen\n // contact. isMouseActionButton returns true in these cases (evt.button is set\n // to 0).\n // See http://www.w3.org/TR/pointerevents/#button-states\n // We only fire click, singleclick, and doubleclick if nobody has called\n // event.preventDefault().\n if (\n this.emulateClicks_ &&\n !newEvent.defaultPrevented &&\n !this.dragging_ &&\n this.isMouseActionButton_(pointerEvent)\n ) {\n this.emulateClick_(this.down_);\n }\n\n if (this.activePointers_.length === 0) {\n this.dragListenerKeys_.forEach(unlistenByKey);\n this.dragListenerKeys_.length = 0;\n this.dragging_ = false;\n this.down_ = null;\n }\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @return {boolean} If the left mouse button was pressed.\n * @private\n */\n isMouseActionButton_(pointerEvent) {\n return pointerEvent.button === 0;\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerDown_(pointerEvent) {\n this.emulateClicks_ = this.activePointers_.length === 0;\n this.updateActivePointers_(pointerEvent);\n const newEvent = new MapBrowserEvent(\n MapBrowserEventType.POINTERDOWN,\n this.map_,\n pointerEvent,\n undefined,\n undefined,\n this.activePointers_,\n );\n this.dispatchEvent(newEvent);\n\n this.down_ = new PointerEvent(pointerEvent.type, pointerEvent);\n Object.defineProperty(this.down_, 'target', {\n writable: false,\n value: pointerEvent.target,\n });\n\n if (this.dragListenerKeys_.length === 0) {\n const doc = this.map_.getOwnerDocument();\n this.dragListenerKeys_.push(\n listen(\n doc,\n MapBrowserEventType.POINTERMOVE,\n this.handlePointerMove_,\n this,\n ),\n listen(doc, MapBrowserEventType.POINTERUP, this.handlePointerUp_, this),\n /* Note that the listener for `pointercancel is set up on\n * `pointerEventHandler_` and not `documentPointerEventHandler_` like\n * the `pointerup` and `pointermove` listeners.\n *\n * The reason for this is the following: `TouchSource.vacuumTouches_()`\n * issues `pointercancel` events, when there was no `touchend` for a\n * `touchstart`. Now, let's say a first `touchstart` is registered on\n * `pointerEventHandler_`. The `documentPointerEventHandler_` is set up.\n * But `documentPointerEventHandler_` doesn't know about the first\n * `touchstart`. If there is no `touchend` for the `touchstart`, we can\n * only receive a `touchcancel` from `pointerEventHandler_`, because it is\n * only registered there.\n */\n listen(\n this.element_,\n MapBrowserEventType.POINTERCANCEL,\n this.handlePointerUp_,\n this,\n ),\n );\n if (this.element_.getRootNode && this.element_.getRootNode() !== doc) {\n this.dragListenerKeys_.push(\n listen(\n this.element_.getRootNode(),\n MapBrowserEventType.POINTERUP,\n this.handlePointerUp_,\n this,\n ),\n );\n }\n }\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n handlePointerMove_(pointerEvent) {\n // Between pointerdown and pointerup, pointermove events are triggered.\n // To avoid a 'false' touchmove event to be dispatched, we test if the pointer\n // moved a significant distance.\n if (this.isMoving_(pointerEvent)) {\n this.updateActivePointers_(pointerEvent);\n this.dragging_ = true;\n const newEvent = new MapBrowserEvent(\n MapBrowserEventType.POINTERDRAG,\n this.map_,\n pointerEvent,\n this.dragging_,\n undefined,\n this.activePointers_,\n );\n this.dispatchEvent(newEvent);\n }\n }\n\n /**\n * Wrap and relay a pointermove event.\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @private\n */\n relayMoveEvent_(pointerEvent) {\n this.originalPointerMoveEvent_ = pointerEvent;\n const dragging = !!(this.down_ && this.isMoving_(pointerEvent));\n this.dispatchEvent(\n new MapBrowserEvent(\n MapBrowserEventType.POINTERMOVE,\n this.map_,\n pointerEvent,\n dragging,\n ),\n );\n }\n\n /**\n * Flexible handling of a `touch-action: none` css equivalent: because calling\n * `preventDefault()` on a `pointermove` event does not stop native page scrolling\n * and zooming, we also listen for `touchmove` and call `preventDefault()` on it\n * when an interaction (currently `DragPan` handles the event.\n * @param {TouchEvent} event Event.\n * @private\n */\n handleTouchMove_(event) {\n // Due to https://github.com/mpizenberg/elm-pep/issues/2, `this.originalPointerMoveEvent_`\n // may not be initialized yet when we get here on a platform without native pointer events,\n // when elm-pep is used as pointer events polyfill.\n const originalEvent = this.originalPointerMoveEvent_;\n if (\n (!originalEvent || originalEvent.defaultPrevented) &&\n (typeof event.cancelable !== 'boolean' || event.cancelable === true)\n ) {\n event.preventDefault();\n }\n }\n\n /**\n * @param {PointerEvent} pointerEvent Pointer\n * event.\n * @return {boolean} Is moving.\n * @private\n */\n isMoving_(pointerEvent) {\n return (\n this.dragging_ ||\n Math.abs(pointerEvent.clientX - this.down_.clientX) >\n this.moveTolerance_ ||\n Math.abs(pointerEvent.clientY - this.down_.clientY) > this.moveTolerance_\n );\n }\n\n /**\n * Clean up.\n * @override\n */\n disposeInternal() {\n if (this.relayedListenerKey_) {\n unlistenByKey(this.relayedListenerKey_);\n this.relayedListenerKey_ = null;\n }\n this.element_.removeEventListener(\n EventType.TOUCHMOVE,\n this.boundHandleTouchMove_,\n );\n\n if (this.pointerdownListenerKey_) {\n unlistenByKey(this.pointerdownListenerKey_);\n this.pointerdownListenerKey_ = null;\n }\n\n this.dragListenerKeys_.forEach(unlistenByKey);\n this.dragListenerKeys_.length = 0;\n\n this.element_ = null;\n super.disposeInternal();\n }\n}\n\nexport default MapBrowserEventHandler;\n","/**\n * @module ol/MapEventType\n */\n\n/**\n * @enum {string}\n */\nexport default {\n /**\n * Triggered after a map frame is rendered.\n * @event module:ol/MapEvent~MapEvent#postrender\n * @api\n */\n POSTRENDER: 'postrender',\n\n /**\n * Triggered when the map starts moving.\n * @event module:ol/MapEvent~MapEvent#movestart\n * @api\n */\n MOVESTART: 'movestart',\n\n /**\n * Triggered after the map is moved.\n * @event module:ol/MapEvent~MapEvent#moveend\n * @api\n */\n MOVEEND: 'moveend',\n\n /**\n * Triggered when loading of additional map data (tiles, images, features) starts.\n * @event module:ol/MapEvent~MapEvent#loadstart\n * @api\n */\n LOADSTART: 'loadstart',\n\n /**\n * Triggered when loading of additional map data has completed.\n * @event module:ol/MapEvent~MapEvent#loadend\n * @api\n */\n LOADEND: 'loadend',\n};\n\n/***\n * @typedef {'postrender'|'movestart'|'moveend'|'loadstart'|'loadend'} Types\n */\n","/**\n * @module ol/MapProperty\n */\n\n/**\n * @enum {string}\n */\nexport default {\n LAYERGROUP: 'layergroup',\n SIZE: 'size',\n TARGET: 'target',\n VIEW: 'view',\n};\n","/**\n * @module ol/TileState\n */\n\n/**\n * @enum {number}\n */\nexport default {\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n /**\n * Indicates that tile loading failed\n * @type {number}\n */\n ERROR: 3,\n EMPTY: 4,\n};\n","/**\n * @module ol/asserts\n */\n\n/**\n * @param {*} assertion Assertion we expected to be truthy.\n * @param {string} errorMessage Error message.\n */\nexport function assert(assertion, errorMessage) {\n if (!assertion) {\n throw new Error(errorMessage);\n }\n}\n","/**\n * @module ol/structs/PriorityQueue\n */\nimport {assert} from '../asserts.js';\nimport {clear} from '../obj.js';\n\n/**\n * @type {number}\n */\nexport const DROP = Infinity;\n\n/**\n * @classdesc\n * Priority queue.\n *\n * The implementation is inspired from the Closure Library's Heap class and\n * Python's heapq module.\n *\n * See https://github.com/google/closure-library/blob/master/closure/goog/structs/heap.js\n * and https://hg.python.org/cpython/file/2.7/Lib/heapq.py.\n *\n * @template T\n */\nclass PriorityQueue {\n /**\n * @param {function(T): number} priorityFunction Priority function.\n * @param {function(T): string} keyFunction Key function.\n */\n constructor(priorityFunction, keyFunction) {\n /**\n * @type {function(T): number}\n * @private\n */\n this.priorityFunction_ = priorityFunction;\n\n /**\n * @type {function(T): string}\n * @private\n */\n this.keyFunction_ = keyFunction;\n\n /**\n * @type {Array}\n * @private\n */\n this.elements_ = [];\n\n /**\n * @type {Array}\n * @private\n */\n this.priorities_ = [];\n\n /**\n * @type {!Object}\n * @private\n */\n this.queuedElements_ = {};\n }\n\n /**\n * FIXME empty description for jsdoc\n */\n clear() {\n this.elements_.length = 0;\n this.priorities_.length = 0;\n clear(this.queuedElements_);\n }\n\n /**\n * Remove and return the highest-priority element. O(log N).\n * @return {T} Element.\n */\n dequeue() {\n const elements = this.elements_;\n const priorities = this.priorities_;\n const element = elements[0];\n if (elements.length == 1) {\n elements.length = 0;\n priorities.length = 0;\n } else {\n elements[0] = /** @type {T} */ (elements.pop());\n priorities[0] = /** @type {number} */ (priorities.pop());\n this.siftUp_(0);\n }\n const elementKey = this.keyFunction_(element);\n delete this.queuedElements_[elementKey];\n return element;\n }\n\n /**\n * Enqueue an element. O(log N).\n * @param {T} element Element.\n * @return {boolean} The element was added to the queue.\n */\n enqueue(element) {\n assert(\n !(this.keyFunction_(element) in this.queuedElements_),\n 'Tried to enqueue an `element` that was already added to the queue',\n );\n const priority = this.priorityFunction_(element);\n if (priority != DROP) {\n this.elements_.push(element);\n this.priorities_.push(priority);\n this.queuedElements_[this.keyFunction_(element)] = true;\n this.siftDown_(0, this.elements_.length - 1);\n return true;\n }\n return false;\n }\n\n /**\n * @return {number} Count.\n */\n getCount() {\n return this.elements_.length;\n }\n\n /**\n * Gets the index of the left child of the node at the given index.\n * @param {number} index The index of the node to get the left child for.\n * @return {number} The index of the left child.\n * @private\n */\n getLeftChildIndex_(index) {\n return index * 2 + 1;\n }\n\n /**\n * Gets the index of the right child of the node at the given index.\n * @param {number} index The index of the node to get the right child for.\n * @return {number} The index of the right child.\n * @private\n */\n getRightChildIndex_(index) {\n return index * 2 + 2;\n }\n\n /**\n * Gets the index of the parent of the node at the given index.\n * @param {number} index The index of the node to get the parent for.\n * @return {number} The index of the parent.\n * @private\n */\n getParentIndex_(index) {\n return (index - 1) >> 1;\n }\n\n /**\n * Make this a heap. O(N).\n * @private\n */\n heapify_() {\n let i;\n for (i = (this.elements_.length >> 1) - 1; i >= 0; i--) {\n this.siftUp_(i);\n }\n }\n\n /**\n * @return {boolean} Is empty.\n */\n isEmpty() {\n return this.elements_.length === 0;\n }\n\n /**\n * @param {string} key Key.\n * @return {boolean} Is key queued.\n */\n isKeyQueued(key) {\n return key in this.queuedElements_;\n }\n\n /**\n * @param {T} element Element.\n * @return {boolean} Is queued.\n */\n isQueued(element) {\n return this.isKeyQueued(this.keyFunction_(element));\n }\n\n /**\n * @param {number} index The index of the node to move down.\n * @private\n */\n siftUp_(index) {\n const elements = this.elements_;\n const priorities = this.priorities_;\n const count = elements.length;\n const element = elements[index];\n const priority = priorities[index];\n const startIndex = index;\n\n while (index < count >> 1) {\n const lIndex = this.getLeftChildIndex_(index);\n const rIndex = this.getRightChildIndex_(index);\n\n const smallerChildIndex =\n rIndex < count && priorities[rIndex] < priorities[lIndex]\n ? rIndex\n : lIndex;\n\n elements[index] = elements[smallerChildIndex];\n priorities[index] = priorities[smallerChildIndex];\n index = smallerChildIndex;\n }\n\n elements[index] = element;\n priorities[index] = priority;\n this.siftDown_(startIndex, index);\n }\n\n /**\n * @param {number} startIndex The index of the root.\n * @param {number} index The index of the node to move up.\n * @private\n */\n siftDown_(startIndex, index) {\n const elements = this.elements_;\n const priorities = this.priorities_;\n const element = elements[index];\n const priority = priorities[index];\n\n while (index > startIndex) {\n const parentIndex = this.getParentIndex_(index);\n if (priorities[parentIndex] > priority) {\n elements[index] = elements[parentIndex];\n priorities[index] = priorities[parentIndex];\n index = parentIndex;\n } else {\n break;\n }\n }\n elements[index] = element;\n priorities[index] = priority;\n }\n\n /**\n * FIXME empty description for jsdoc\n */\n reprioritize() {\n const priorityFunction = this.priorityFunction_;\n const elements = this.elements_;\n const priorities = this.priorities_;\n let index = 0;\n const n = elements.length;\n let element, i, priority;\n for (i = 0; i < n; ++i) {\n element = elements[i];\n priority = priorityFunction(element);\n if (priority == DROP) {\n delete this.queuedElements_[this.keyFunction_(element)];\n } else {\n priorities[index] = priority;\n elements[index++] = element;\n }\n }\n elements.length = index;\n priorities.length = index;\n this.heapify_();\n }\n}\n\nexport default PriorityQueue;\n","/**\n * @module ol/TileQueue\n */\nimport TileState from './TileState.js';\nimport EventType from './events/EventType.js';\nimport PriorityQueue, {DROP} from './structs/PriorityQueue.js';\n\n/**\n * @typedef {function(import(\"./Tile.js\").default, string, import('./tilecoord.js').TileCoord, number): number} PriorityFunction\n */\n\n/**\n * @typedef {[import('./Tile.js').default, string, import('./tilecoord.js').TileCoord, number]} TileQueueElement\n */\n\n/**\n * @extends PriorityQueue}\n */\nclass TileQueue extends PriorityQueue {\n /**\n * @param {PriorityFunction} tilePriorityFunction Tile priority function.\n * @param {function(): ?} tileChangeCallback Function called on each tile change event.\n */\n constructor(tilePriorityFunction, tileChangeCallback) {\n super(\n (element) => tilePriorityFunction.apply(null, element),\n (element) => element[0].getKey(),\n );\n\n /** @private */\n this.boundHandleTileChange_ = this.handleTileChange.bind(this);\n\n /**\n * @private\n * @type {function(): ?}\n */\n this.tileChangeCallback_ = tileChangeCallback;\n\n /**\n * @private\n * @type {number}\n */\n this.tilesLoading_ = 0;\n\n /**\n * @private\n * @type {!Object}\n */\n this.tilesLoadingKeys_ = {};\n }\n\n /**\n * @param {TileQueueElement} element Element.\n * @return {boolean} The element was added to the queue.\n * @override\n */\n enqueue(element) {\n const added = super.enqueue(element);\n if (added) {\n const tile = element[0];\n tile.addEventListener(EventType.CHANGE, this.boundHandleTileChange_);\n }\n return added;\n }\n\n /**\n * @return {number} Number of tiles loading.\n */\n getTilesLoading() {\n return this.tilesLoading_;\n }\n\n /**\n * @param {import(\"./events/Event.js\").default} event Event.\n * @protected\n */\n handleTileChange(event) {\n const tile = /** @type {import(\"./Tile.js\").default} */ (event.target);\n const state = tile.getState();\n if (\n state === TileState.LOADED ||\n state === TileState.ERROR ||\n state === TileState.EMPTY\n ) {\n if (state !== TileState.ERROR) {\n tile.removeEventListener(EventType.CHANGE, this.boundHandleTileChange_);\n }\n const tileKey = tile.getKey();\n if (tileKey in this.tilesLoadingKeys_) {\n delete this.tilesLoadingKeys_[tileKey];\n --this.tilesLoading_;\n }\n this.tileChangeCallback_();\n }\n }\n\n /**\n * @param {number} maxTotalLoading Maximum number tiles to load simultaneously.\n * @param {number} maxNewLoads Maximum number of new tiles to load.\n */\n loadMoreTiles(maxTotalLoading, maxNewLoads) {\n let newLoads = 0;\n while (\n this.tilesLoading_ < maxTotalLoading &&\n newLoads < maxNewLoads &&\n this.getCount() > 0\n ) {\n const tile = this.dequeue()[0];\n const tileKey = tile.getKey();\n const state = tile.getState();\n if (state === TileState.IDLE && !(tileKey in this.tilesLoadingKeys_)) {\n this.tilesLoadingKeys_[tileKey] = true;\n ++this.tilesLoading_;\n ++newLoads;\n tile.load();\n }\n }\n }\n}\n\nexport default TileQueue;\n\n/**\n * @param {import('./Map.js').FrameState} frameState Frame state.\n * @param {import(\"./Tile.js\").default} tile Tile.\n * @param {string} tileSourceKey Tile source key.\n * @param {import(\"./coordinate.js\").Coordinate} tileCenter Tile center.\n * @param {number} tileResolution Tile resolution.\n * @return {number} Tile priority.\n */\nexport function getTilePriority(\n frameState,\n tile,\n tileSourceKey,\n tileCenter,\n tileResolution,\n) {\n // Filter out tiles at higher zoom levels than the current zoom level, or that\n // are outside the visible extent.\n if (!frameState || !(tileSourceKey in frameState.wantedTiles)) {\n return DROP;\n }\n if (!frameState.wantedTiles[tileSourceKey][tile.getKey()]) {\n return DROP;\n }\n // Prioritize the highest zoom level tiles closest to the focus.\n // Tiles at higher zoom levels are prioritized using Math.log(tileResolution).\n // Within a zoom level, tiles are prioritized by the distance in pixels between\n // the center of the tile and the center of the viewport. The factor of 65536\n // means that the prioritization should behave as desired for tiles up to\n // 65536 * Math.log(2) = 45426 pixels from the focus.\n const center = frameState.viewState.center;\n const deltaX = tileCenter[0] - center[0];\n const deltaY = tileCenter[1] - center[1];\n return (\n 65536 * Math.log(tileResolution) +\n Math.sqrt(deltaX * deltaX + deltaY * deltaY) / tileResolution\n );\n}\n","/**\n * @module ol/ViewHint\n */\n\n/**\n * @enum {number}\n */\nexport default {\n ANIMATING: 0,\n INTERACTING: 1,\n};\n","/**\n * @module ol/ViewProperty\n */\n\n/**\n * @enum {string}\n */\nexport default {\n CENTER: 'center',\n RESOLUTION: 'resolution',\n ROTATION: 'rotation',\n};\n","/**\n * @module ol/math\n */\n\n/**\n * Takes a number and clamps it to within the provided bounds.\n * @param {number} value The input number.\n * @param {number} min The minimum value to return.\n * @param {number} max The maximum value to return.\n * @return {number} The input number if it is within bounds, or the nearest\n * number within the bounds.\n */\nexport function clamp(value, min, max) {\n return Math.min(Math.max(value, min), max);\n}\n\n/**\n * Returns the square of the closest distance between the point (x, y) and the\n * line segment (x1, y1) to (x2, y2).\n * @param {number} x X.\n * @param {number} y Y.\n * @param {number} x1 X1.\n * @param {number} y1 Y1.\n * @param {number} x2 X2.\n * @param {number} y2 Y2.\n * @return {number} Squared distance.\n */\nexport function squaredSegmentDistance(x, y, x1, y1, x2, y2) {\n const dx = x2 - x1;\n const dy = y2 - y1;\n if (dx !== 0 || dy !== 0) {\n const t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);\n if (t > 1) {\n x1 = x2;\n y1 = y2;\n } else if (t > 0) {\n x1 += dx * t;\n y1 += dy * t;\n }\n }\n return squaredDistance(x, y, x1, y1);\n}\n\n/**\n * Returns the square of the distance between the points (x1, y1) and (x2, y2).\n * @param {number} x1 X1.\n * @param {number} y1 Y1.\n * @param {number} x2 X2.\n * @param {number} y2 Y2.\n * @return {number} Squared distance.\n */\nexport function squaredDistance(x1, y1, x2, y2) {\n const dx = x2 - x1;\n const dy = y2 - y1;\n return dx * dx + dy * dy;\n}\n\n/**\n * Solves system of linear equations using Gaussian elimination method.\n *\n * @param {Array>} mat Augmented matrix (n x n + 1 column)\n * in row-major order.\n * @return {Array|null} The resulting vector.\n */\nexport function solveLinearSystem(mat) {\n const n = mat.length;\n\n for (let i = 0; i < n; i++) {\n // Find max in the i-th column (ignoring i - 1 first rows)\n let maxRow = i;\n let maxEl = Math.abs(mat[i][i]);\n for (let r = i + 1; r < n; r++) {\n const absValue = Math.abs(mat[r][i]);\n if (absValue > maxEl) {\n maxEl = absValue;\n maxRow = r;\n }\n }\n\n if (maxEl === 0) {\n return null; // matrix is singular\n }\n\n // Swap max row with i-th (current) row\n const tmp = mat[maxRow];\n mat[maxRow] = mat[i];\n mat[i] = tmp;\n\n // Subtract the i-th row to make all the remaining rows 0 in the i-th column\n for (let j = i + 1; j < n; j++) {\n const coef = -mat[j][i] / mat[i][i];\n for (let k = i; k < n + 1; k++) {\n if (i == k) {\n mat[j][k] = 0;\n } else {\n mat[j][k] += coef * mat[i][k];\n }\n }\n }\n }\n\n // Solve Ax=b for upper triangular matrix A (mat)\n const x = new Array(n);\n for (let l = n - 1; l >= 0; l--) {\n x[l] = mat[l][n] / mat[l][l];\n for (let m = l - 1; m >= 0; m--) {\n mat[m][n] -= mat[m][l] * x[l];\n }\n }\n return x;\n}\n\n/**\n * Converts radians to to degrees.\n *\n * @param {number} angleInRadians Angle in radians.\n * @return {number} Angle in degrees.\n */\nexport function toDegrees(angleInRadians) {\n return (angleInRadians * 180) / Math.PI;\n}\n\n/**\n * Converts degrees to radians.\n *\n * @param {number} angleInDegrees Angle in degrees.\n * @return {number} Angle in radians.\n */\nexport function toRadians(angleInDegrees) {\n return (angleInDegrees * Math.PI) / 180;\n}\n\n/**\n * Returns the modulo of a / b, depending on the sign of b.\n *\n * @param {number} a Dividend.\n * @param {number} b Divisor.\n * @return {number} Modulo.\n */\nexport function modulo(a, b) {\n const r = a % b;\n return r * b < 0 ? r + b : r;\n}\n\n/**\n * Calculates the linearly interpolated value of x between a and b.\n *\n * @param {number} a Number\n * @param {number} b Number\n * @param {number} x Value to be interpolated.\n * @return {number} Interpolated value.\n */\nexport function lerp(a, b, x) {\n return a + x * (b - a);\n}\n\n/**\n * Returns a number with a limited number of decimal digits.\n * @param {number} n The input number.\n * @param {number} decimals The maximum number of decimal digits.\n * @return {number} The input number with a limited number of decimal digits.\n */\nexport function toFixed(n, decimals) {\n const factor = Math.pow(10, decimals);\n return Math.round(n * factor) / factor;\n}\n\n/**\n * Rounds a number to the nearest integer value considering only the given number\n * of decimal digits (with rounding on the final digit).\n * @param {number} n The input number.\n * @param {number} decimals The maximum number of decimal digits.\n * @return {number} The nearest integer.\n */\nexport function round(n, decimals) {\n return Math.round(toFixed(n, decimals));\n}\n\n/**\n * Rounds a number to the next smaller integer considering only the given number\n * of decimal digits (with rounding on the final digit).\n * @param {number} n The input number.\n * @param {number} decimals The maximum number of decimal digits.\n * @return {number} The next smaller integer.\n */\nexport function floor(n, decimals) {\n return Math.floor(toFixed(n, decimals));\n}\n\n/**\n * Rounds a number to the next bigger integer considering only the given number\n * of decimal digits (with rounding on the final digit).\n * @param {number} n The input number.\n * @param {number} decimals The maximum number of decimal digits.\n * @return {number} The next bigger integer.\n */\nexport function ceil(n, decimals) {\n return Math.ceil(toFixed(n, decimals));\n}\n\n/**\n * Wraps a number between some minimum and maximum values.\n * @param {number} n The number to wrap.\n * @param {number} min The minimum of the range (inclusive).\n * @param {number} max The maximum of the range (exclusive).\n * @return {number} The wrapped number.\n */\nexport function wrap(n, min, max) {\n if (n >= min && n < max) {\n return n;\n }\n const range = max - min;\n return ((((n - min) % range) + range) % range) + min;\n}\n","/**\n * @module ol/centerconstraint\n */\nimport {clamp} from './math.js';\n\n/**\n * @typedef {function((import(\"./coordinate.js\").Coordinate|undefined), number, import(\"./size.js\").Size, boolean=, Array=): (import(\"./coordinate.js\").Coordinate|undefined)} Type\n */\n\n/**\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {boolean} onlyCenter If true, the constraint will only apply to the view center.\n * @param {boolean} smooth If true, the view will be able to go slightly out of the given extent\n * (only during interaction and animation).\n * @return {Type} The constraint.\n */\nexport function createExtent(extent, onlyCenter, smooth) {\n return (\n /**\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center Center.\n * @param {number|undefined} resolution Resolution.\n * @param {import(\"./size.js\").Size} size Viewport size; unused if `onlyCenter` was specified.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @param {Array} [centerShift] Shift between map center and viewport center.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center.\n */\n function (center, resolution, size, isMoving, centerShift) {\n if (!center) {\n return undefined;\n }\n if (!resolution && !onlyCenter) {\n return center;\n }\n const viewWidth = onlyCenter ? 0 : size[0] * resolution;\n const viewHeight = onlyCenter ? 0 : size[1] * resolution;\n const shiftX = centerShift ? centerShift[0] : 0;\n const shiftY = centerShift ? centerShift[1] : 0;\n let minX = extent[0] + viewWidth / 2 + shiftX;\n let maxX = extent[2] - viewWidth / 2 + shiftX;\n let minY = extent[1] + viewHeight / 2 + shiftY;\n let maxY = extent[3] - viewHeight / 2 + shiftY;\n\n // note: when zooming out of bounds, min and max values for x and y may\n // end up inverted (min > max); this has to be accounted for\n if (minX > maxX) {\n minX = (maxX + minX) / 2;\n maxX = minX;\n }\n if (minY > maxY) {\n minY = (maxY + minY) / 2;\n maxY = minY;\n }\n\n let x = clamp(center[0], minX, maxX);\n let y = clamp(center[1], minY, maxY);\n\n // during an interaction, allow some overscroll\n if (isMoving && smooth && resolution) {\n const ratio = 30 * resolution;\n x +=\n -ratio * Math.log(1 + Math.max(0, minX - center[0]) / ratio) +\n ratio * Math.log(1 + Math.max(0, center[0] - maxX) / ratio);\n y +=\n -ratio * Math.log(1 + Math.max(0, minY - center[1]) / ratio) +\n ratio * Math.log(1 + Math.max(0, center[1] - maxY) / ratio);\n }\n\n return [x, y];\n }\n );\n}\n\n/**\n * @param {import(\"./coordinate.js\").Coordinate} [center] Center.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center.\n */\nexport function none(center) {\n return center;\n}\n","/**\n * @module ol/extent/Relationship\n */\n\n/**\n * Relationship to an extent.\n * @enum {number}\n */\nexport default {\n UNKNOWN: 0,\n INTERSECTING: 1,\n ABOVE: 2,\n RIGHT: 4,\n BELOW: 8,\n LEFT: 16,\n};\n","/**\n * @module ol/extent\n */\nimport Relationship from './extent/Relationship.js';\n\n/**\n * An array of numbers representing an extent: `[minx, miny, maxx, maxy]`.\n * @typedef {Array} Extent\n * @api\n */\n\n/**\n * Extent corner.\n * @typedef {'bottom-left' | 'bottom-right' | 'top-left' | 'top-right'} Corner\n */\n\n/**\n * Build an extent that includes all given coordinates.\n *\n * @param {Array} coordinates Coordinates.\n * @return {Extent} Bounding extent.\n * @api\n */\nexport function boundingExtent(coordinates) {\n const extent = createEmpty();\n for (let i = 0, ii = coordinates.length; i < ii; ++i) {\n extendCoordinate(extent, coordinates[i]);\n }\n return extent;\n}\n\n/**\n * @param {Array} xs Xs.\n * @param {Array} ys Ys.\n * @param {Extent} [dest] Destination extent.\n * @private\n * @return {Extent} Extent.\n */\nfunction _boundingExtentXYs(xs, ys, dest) {\n const minX = Math.min.apply(null, xs);\n const minY = Math.min.apply(null, ys);\n const maxX = Math.max.apply(null, xs);\n const maxY = Math.max.apply(null, ys);\n return createOrUpdate(minX, minY, maxX, maxY, dest);\n}\n\n/**\n * Return extent increased by the provided value.\n * @param {Extent} extent Extent.\n * @param {number} value The amount by which the extent should be buffered.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n * @api\n */\nexport function buffer(extent, value, dest) {\n if (dest) {\n dest[0] = extent[0] - value;\n dest[1] = extent[1] - value;\n dest[2] = extent[2] + value;\n dest[3] = extent[3] + value;\n return dest;\n }\n return [\n extent[0] - value,\n extent[1] - value,\n extent[2] + value,\n extent[3] + value,\n ];\n}\n\n/**\n * Creates a clone of an extent.\n *\n * @param {Extent} extent Extent to clone.\n * @param {Extent} [dest] Extent.\n * @return {Extent} The clone.\n */\nexport function clone(extent, dest) {\n if (dest) {\n dest[0] = extent[0];\n dest[1] = extent[1];\n dest[2] = extent[2];\n dest[3] = extent[3];\n return dest;\n }\n return extent.slice();\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {number} Closest squared distance.\n */\nexport function closestSquaredDistanceXY(extent, x, y) {\n let dx, dy;\n if (x < extent[0]) {\n dx = extent[0] - x;\n } else if (extent[2] < x) {\n dx = x - extent[2];\n } else {\n dx = 0;\n }\n if (y < extent[1]) {\n dy = extent[1] - y;\n } else if (extent[3] < y) {\n dy = y - extent[3];\n } else {\n dy = 0;\n }\n return dx * dx + dy * dy;\n}\n\n/**\n * Check if the passed coordinate is contained or on the edge of the extent.\n *\n * @param {Extent} extent Extent.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {boolean} The coordinate is contained in the extent.\n * @api\n */\nexport function containsCoordinate(extent, coordinate) {\n return containsXY(extent, coordinate[0], coordinate[1]);\n}\n\n/**\n * Check if one extent contains another.\n *\n * An extent is deemed contained if it lies completely within the other extent,\n * including if they share one or more edges.\n *\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {boolean} The second extent is contained by or on the edge of the\n * first.\n * @api\n */\nexport function containsExtent(extent1, extent2) {\n return (\n extent1[0] <= extent2[0] &&\n extent2[2] <= extent1[2] &&\n extent1[1] <= extent2[1] &&\n extent2[3] <= extent1[3]\n );\n}\n\n/**\n * Check if the passed coordinate is contained or on the edge of the extent.\n *\n * @param {Extent} extent Extent.\n * @param {number} x X coordinate.\n * @param {number} y Y coordinate.\n * @return {boolean} The x, y values are contained in the extent.\n * @api\n */\nexport function containsXY(extent, x, y) {\n return extent[0] <= x && x <= extent[2] && extent[1] <= y && y <= extent[3];\n}\n\n/**\n * Get the relationship between a coordinate and extent.\n * @param {Extent} extent The extent.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate The coordinate.\n * @return {import(\"./extent/Relationship.js\").default} The relationship (bitwise compare with\n * import(\"./extent/Relationship.js\").Relationship).\n */\nexport function coordinateRelationship(extent, coordinate) {\n const minX = extent[0];\n const minY = extent[1];\n const maxX = extent[2];\n const maxY = extent[3];\n const x = coordinate[0];\n const y = coordinate[1];\n let relationship = Relationship.UNKNOWN;\n if (x < minX) {\n relationship = relationship | Relationship.LEFT;\n } else if (x > maxX) {\n relationship = relationship | Relationship.RIGHT;\n }\n if (y < minY) {\n relationship = relationship | Relationship.BELOW;\n } else if (y > maxY) {\n relationship = relationship | Relationship.ABOVE;\n }\n if (relationship === Relationship.UNKNOWN) {\n relationship = Relationship.INTERSECTING;\n }\n return relationship;\n}\n\n/**\n * Create an empty extent.\n * @return {Extent} Empty extent.\n * @api\n */\nexport function createEmpty() {\n return [Infinity, Infinity, -Infinity, -Infinity];\n}\n\n/**\n * Create a new extent or update the provided extent.\n * @param {number} minX Minimum X.\n * @param {number} minY Minimum Y.\n * @param {number} maxX Maximum X.\n * @param {number} maxY Maximum Y.\n * @param {Extent} [dest] Destination extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdate(minX, minY, maxX, maxY, dest) {\n if (dest) {\n dest[0] = minX;\n dest[1] = minY;\n dest[2] = maxX;\n dest[3] = maxY;\n return dest;\n }\n return [minX, minY, maxX, maxY];\n}\n\n/**\n * Create a new empty extent or make the provided one empty.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdateEmpty(dest) {\n return createOrUpdate(Infinity, Infinity, -Infinity, -Infinity, dest);\n}\n\n/**\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdateFromCoordinate(coordinate, dest) {\n const x = coordinate[0];\n const y = coordinate[1];\n return createOrUpdate(x, y, x, y, dest);\n}\n\n/**\n * @param {Array} coordinates Coordinates.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdateFromCoordinates(coordinates, dest) {\n const extent = createOrUpdateEmpty(dest);\n return extendCoordinates(extent, coordinates);\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdateFromFlatCoordinates(\n flatCoordinates,\n offset,\n end,\n stride,\n dest,\n) {\n const extent = createOrUpdateEmpty(dest);\n return extendFlatCoordinates(extent, flatCoordinates, offset, end, stride);\n}\n\n/**\n * @param {Array>} rings Rings.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function createOrUpdateFromRings(rings, dest) {\n const extent = createOrUpdateEmpty(dest);\n return extendRings(extent, rings);\n}\n\n/**\n * Determine if two extents are equivalent.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {boolean} The two extents are equivalent.\n * @api\n */\nexport function equals(extent1, extent2) {\n return (\n extent1[0] == extent2[0] &&\n extent1[2] == extent2[2] &&\n extent1[1] == extent2[1] &&\n extent1[3] == extent2[3]\n );\n}\n\n/**\n * Determine if two extents are approximately equivalent.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @param {number} tolerance Tolerance in extent coordinate units.\n * @return {boolean} The two extents differ by less than the tolerance.\n */\nexport function approximatelyEquals(extent1, extent2, tolerance) {\n return (\n Math.abs(extent1[0] - extent2[0]) < tolerance &&\n Math.abs(extent1[2] - extent2[2]) < tolerance &&\n Math.abs(extent1[1] - extent2[1]) < tolerance &&\n Math.abs(extent1[3] - extent2[3]) < tolerance\n );\n}\n\n/**\n * Modify an extent to include another extent.\n * @param {Extent} extent1 The extent to be modified.\n * @param {Extent} extent2 The extent that will be included in the first.\n * @return {Extent} A reference to the first (extended) extent.\n * @api\n */\nexport function extend(extent1, extent2) {\n if (extent2[0] < extent1[0]) {\n extent1[0] = extent2[0];\n }\n if (extent2[2] > extent1[2]) {\n extent1[2] = extent2[2];\n }\n if (extent2[1] < extent1[1]) {\n extent1[1] = extent2[1];\n }\n if (extent2[3] > extent1[3]) {\n extent1[3] = extent2[3];\n }\n return extent1;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n */\nexport function extendCoordinate(extent, coordinate) {\n if (coordinate[0] < extent[0]) {\n extent[0] = coordinate[0];\n }\n if (coordinate[0] > extent[2]) {\n extent[2] = coordinate[0];\n }\n if (coordinate[1] < extent[1]) {\n extent[1] = coordinate[1];\n }\n if (coordinate[1] > extent[3]) {\n extent[3] = coordinate[1];\n }\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {Array} coordinates Coordinates.\n * @return {Extent} Extent.\n */\nexport function extendCoordinates(extent, coordinates) {\n for (let i = 0, ii = coordinates.length; i < ii; ++i) {\n extendCoordinate(extent, coordinates[i]);\n }\n return extent;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {Extent} Extent.\n */\nexport function extendFlatCoordinates(\n extent,\n flatCoordinates,\n offset,\n end,\n stride,\n) {\n for (; offset < end; offset += stride) {\n extendXY(extent, flatCoordinates[offset], flatCoordinates[offset + 1]);\n }\n return extent;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {Array>} rings Rings.\n * @return {Extent} Extent.\n */\nexport function extendRings(extent, rings) {\n for (let i = 0, ii = rings.length; i < ii; ++i) {\n extendCoordinates(extent, rings[i]);\n }\n return extent;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {number} x X.\n * @param {number} y Y.\n */\nexport function extendXY(extent, x, y) {\n extent[0] = Math.min(extent[0], x);\n extent[1] = Math.min(extent[1], y);\n extent[2] = Math.max(extent[2], x);\n extent[3] = Math.max(extent[3], y);\n}\n\n/**\n * This function calls `callback` for each corner of the extent. If the\n * callback returns a truthy value the function returns that value\n * immediately. Otherwise the function returns `false`.\n * @param {Extent} extent Extent.\n * @param {function(import(\"./coordinate.js\").Coordinate): S} callback Callback.\n * @return {S|boolean} Value.\n * @template S\n */\nexport function forEachCorner(extent, callback) {\n let val;\n val = callback(getBottomLeft(extent));\n if (val) {\n return val;\n }\n val = callback(getBottomRight(extent));\n if (val) {\n return val;\n }\n val = callback(getTopRight(extent));\n if (val) {\n return val;\n }\n val = callback(getTopLeft(extent));\n if (val) {\n return val;\n }\n return false;\n}\n\n/**\n * Get the size of an extent.\n * @param {Extent} extent Extent.\n * @return {number} Area.\n * @api\n */\nexport function getArea(extent) {\n let area = 0;\n if (!isEmpty(extent)) {\n area = getWidth(extent) * getHeight(extent);\n }\n return area;\n}\n\n/**\n * Get the bottom left coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import(\"./coordinate.js\").Coordinate} Bottom left coordinate.\n * @api\n */\nexport function getBottomLeft(extent) {\n return [extent[0], extent[1]];\n}\n\n/**\n * Get the bottom right coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import(\"./coordinate.js\").Coordinate} Bottom right coordinate.\n * @api\n */\nexport function getBottomRight(extent) {\n return [extent[2], extent[1]];\n}\n\n/**\n * Get the center coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import(\"./coordinate.js\").Coordinate} Center.\n * @api\n */\nexport function getCenter(extent) {\n return [(extent[0] + extent[2]) / 2, (extent[1] + extent[3]) / 2];\n}\n\n/**\n * Get a corner coordinate of an extent.\n * @param {Extent} extent Extent.\n * @param {Corner} corner Corner.\n * @return {import(\"./coordinate.js\").Coordinate} Corner coordinate.\n */\nexport function getCorner(extent, corner) {\n let coordinate;\n if (corner === 'bottom-left') {\n coordinate = getBottomLeft(extent);\n } else if (corner === 'bottom-right') {\n coordinate = getBottomRight(extent);\n } else if (corner === 'top-left') {\n coordinate = getTopLeft(extent);\n } else if (corner === 'top-right') {\n coordinate = getTopRight(extent);\n } else {\n throw new Error('Invalid corner');\n }\n return coordinate;\n}\n\n/**\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {number} Enlarged area.\n */\nexport function getEnlargedArea(extent1, extent2) {\n const minX = Math.min(extent1[0], extent2[0]);\n const minY = Math.min(extent1[1], extent2[1]);\n const maxX = Math.max(extent1[2], extent2[2]);\n const maxY = Math.max(extent1[3], extent2[3]);\n return (maxX - minX) * (maxY - minY);\n}\n\n/**\n * @param {import(\"./coordinate.js\").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {import(\"./size.js\").Size} size Size.\n * @param {Extent} [dest] Destination extent.\n * @return {Extent} Extent.\n */\nexport function getForViewAndSize(center, resolution, rotation, size, dest) {\n const [x0, y0, x1, y1, x2, y2, x3, y3] = getRotatedViewport(\n center,\n resolution,\n rotation,\n size,\n );\n return createOrUpdate(\n Math.min(x0, x1, x2, x3),\n Math.min(y0, y1, y2, y3),\n Math.max(x0, x1, x2, x3),\n Math.max(y0, y1, y2, y3),\n dest,\n );\n}\n\n/**\n * @param {import(\"./coordinate.js\").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {import(\"./size.js\").Size} size Size.\n * @return {Array} Linear ring representing the viewport.\n */\nexport function getRotatedViewport(center, resolution, rotation, size) {\n const dx = (resolution * size[0]) / 2;\n const dy = (resolution * size[1]) / 2;\n const cosRotation = Math.cos(rotation);\n const sinRotation = Math.sin(rotation);\n const xCos = dx * cosRotation;\n const xSin = dx * sinRotation;\n const yCos = dy * cosRotation;\n const ySin = dy * sinRotation;\n const x = center[0];\n const y = center[1];\n return [\n x - xCos + ySin,\n y - xSin - yCos,\n x - xCos - ySin,\n y - xSin + yCos,\n x + xCos - ySin,\n y + xSin + yCos,\n x + xCos + ySin,\n y + xSin - yCos,\n x - xCos + ySin,\n y - xSin - yCos,\n ];\n}\n\n/**\n * Get the height of an extent.\n * @param {Extent} extent Extent.\n * @return {number} Height.\n * @api\n */\nexport function getHeight(extent) {\n return extent[3] - extent[1];\n}\n\n/**\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @return {number} Intersection area.\n */\nexport function getIntersectionArea(extent1, extent2) {\n const intersection = getIntersection(extent1, extent2);\n return getArea(intersection);\n}\n\n/**\n * Get the intersection of two extents.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent 2.\n * @param {Extent} [dest] Optional extent to populate with intersection.\n * @return {Extent} Intersecting extent.\n * @api\n */\nexport function getIntersection(extent1, extent2, dest) {\n const intersection = dest ? dest : createEmpty();\n if (intersects(extent1, extent2)) {\n if (extent1[0] > extent2[0]) {\n intersection[0] = extent1[0];\n } else {\n intersection[0] = extent2[0];\n }\n if (extent1[1] > extent2[1]) {\n intersection[1] = extent1[1];\n } else {\n intersection[1] = extent2[1];\n }\n if (extent1[2] < extent2[2]) {\n intersection[2] = extent1[2];\n } else {\n intersection[2] = extent2[2];\n }\n if (extent1[3] < extent2[3]) {\n intersection[3] = extent1[3];\n } else {\n intersection[3] = extent2[3];\n }\n } else {\n createOrUpdateEmpty(intersection);\n }\n return intersection;\n}\n\n/**\n * Get the difference between two extents, i.e. the area(s) of `extent1` that\n * are not covered by `extent2`. Returns an array of between 0 and 4 extents.\n *\n * When the extents do not intersect the returned array contains `extent1` as\n * its only element. When `extent2` completely contains `extent1` the returned\n * array is empty. Otherwise up to four non-overlapping extents are returned\n * that together cover exactly the parts of `extent1` outside `extent2`.\n *\n * The decomposition used is:\n *\n * ```\n * ┌────┬─────────┬────┐ ← y2\n * │ │ top │ │\n * │ ├─────────┤ │ ← iy2\n * │left│ (gone) │right│\n * │ ├─────────┤ │ ← iy1\n * │ │ bottom │ │\n * └────┴─────────┴────┘ ← y1\n * x1 ix1 ix2 x2\n * ```\n *\n * The left and right strips span the full height of `extent1` while the top\n * and bottom strips are clamped horizontally to the intersection, so the four\n * rectangles tile perfectly without overlap or gaps.\n *\n * @param {Extent} extent1 Extent to subtract from.\n * @param {Extent} extent2 Extent to subtract.\n * @return {Array} Remaining extents (0–4 elements).\n * @api\n */\nexport function getDifference(extent1, extent2) {\n if (!intersects(extent1, extent2)) {\n return [extent1.slice()];\n }\n if (containsExtent(extent2, extent1)) {\n return [];\n }\n\n const [x1, y1, x2, y2] = extent1;\n const ix1 = Math.max(x1, extent2[0]);\n const iy1 = Math.max(y1, extent2[1]);\n const ix2 = Math.min(x2, extent2[2]);\n const iy2 = Math.min(y2, extent2[3]);\n\n const result = [];\n\n // Left strip (full height of extent1)\n if (ix1 > x1) {\n result.push([x1, y1, ix1, y2]);\n }\n // Right strip (full height of extent1)\n if (ix2 < x2) {\n result.push([ix2, y1, x2, y2]);\n }\n // Bottom strip (between the left and right strips)\n if (iy1 > y1) {\n result.push([ix1, y1, ix2, iy1]);\n }\n // Top strip (between the left and right strips)\n if (iy2 < y2) {\n result.push([ix1, iy2, ix2, y2]);\n }\n\n return result;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @return {number} Margin.\n */\nexport function getMargin(extent) {\n return getWidth(extent) + getHeight(extent);\n}\n\n/**\n * Get the size (width, height) of an extent.\n * @param {Extent} extent The extent.\n * @return {import(\"./size.js\").Size} The extent size.\n * @api\n */\nexport function getSize(extent) {\n return [extent[2] - extent[0], extent[3] - extent[1]];\n}\n\n/**\n * Get the top left coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import(\"./coordinate.js\").Coordinate} Top left coordinate.\n * @api\n */\nexport function getTopLeft(extent) {\n return [extent[0], extent[3]];\n}\n\n/**\n * Get the top right coordinate of an extent.\n * @param {Extent} extent Extent.\n * @return {import(\"./coordinate.js\").Coordinate} Top right coordinate.\n * @api\n */\nexport function getTopRight(extent) {\n return [extent[2], extent[3]];\n}\n\n/**\n * Get the width of an extent.\n * @param {Extent} extent Extent.\n * @return {number} Width.\n * @api\n */\nexport function getWidth(extent) {\n return extent[2] - extent[0];\n}\n\n/**\n * Determine if one extent intersects another.\n * @param {Extent} extent1 Extent 1.\n * @param {Extent} extent2 Extent.\n * @return {boolean} The two extents intersect.\n * @api\n */\nexport function intersects(extent1, extent2) {\n return (\n extent1[0] <= extent2[2] &&\n extent1[2] >= extent2[0] &&\n extent1[1] <= extent2[3] &&\n extent1[3] >= extent2[1]\n );\n}\n\n/**\n * Determine if an extent is empty.\n * @param {Extent} extent Extent.\n * @return {boolean} Is empty.\n * @api\n */\nexport function isEmpty(extent) {\n return extent[2] < extent[0] || extent[3] < extent[1];\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {Extent} [dest] Extent.\n * @return {Extent} Extent.\n */\nexport function returnOrUpdate(extent, dest) {\n if (dest) {\n dest[0] = extent[0];\n dest[1] = extent[1];\n dest[2] = extent[2];\n dest[3] = extent[3];\n return dest;\n }\n return extent;\n}\n\n/**\n * @param {Extent} extent Extent.\n * @param {number} value Value.\n */\nexport function scaleFromCenter(extent, value) {\n const deltaX = ((extent[2] - extent[0]) / 2) * (value - 1);\n const deltaY = ((extent[3] - extent[1]) / 2) * (value - 1);\n extent[0] -= deltaX;\n extent[2] += deltaX;\n extent[1] -= deltaY;\n extent[3] += deltaY;\n}\n\n/**\n * Determine if the segment between two coordinates intersects (crosses,\n * touches, or is contained by) the provided extent.\n * @param {Extent} extent The extent.\n * @param {import(\"./coordinate.js\").Coordinate} start Segment start coordinate.\n * @param {import(\"./coordinate.js\").Coordinate} end Segment end coordinate.\n * @return {boolean} The segment intersects the extent.\n */\nexport function intersectsSegment(extent, start, end) {\n let intersects = false;\n const startRel = coordinateRelationship(extent, start);\n const endRel = coordinateRelationship(extent, end);\n if (\n startRel === Relationship.INTERSECTING ||\n endRel === Relationship.INTERSECTING\n ) {\n intersects = true;\n } else {\n const minX = extent[0];\n const minY = extent[1];\n const maxX = extent[2];\n const maxY = extent[3];\n const startX = start[0];\n const startY = start[1];\n const endX = end[0];\n const endY = end[1];\n const slope = (endY - startY) / (endX - startX);\n let x, y;\n if (!!(endRel & Relationship.ABOVE) && !(startRel & Relationship.ABOVE)) {\n // potentially intersects top\n x = endX - (endY - maxY) / slope;\n intersects = x >= minX && x <= maxX;\n }\n if (\n !intersects &&\n !!(endRel & Relationship.RIGHT) &&\n !(startRel & Relationship.RIGHT)\n ) {\n // potentially intersects right\n y = endY - (endX - maxX) * slope;\n intersects = y >= minY && y <= maxY;\n }\n if (\n !intersects &&\n !!(endRel & Relationship.BELOW) &&\n !(startRel & Relationship.BELOW)\n ) {\n // potentially intersects bottom\n x = endX - (endY - minY) / slope;\n intersects = x >= minX && x <= maxX;\n }\n if (\n !intersects &&\n !!(endRel & Relationship.LEFT) &&\n !(startRel & Relationship.LEFT)\n ) {\n // potentially intersects left\n y = endY - (endX - minX) * slope;\n intersects = y >= minY && y <= maxY;\n }\n }\n return intersects;\n}\n\n/**\n * Apply a transform function to the extent.\n * @param {Extent} extent Extent.\n * @param {import(\"./proj.js\").TransformFunction} transformFn Transform function.\n * Called with `[minX, minY, maxX, maxY]` extent coordinates.\n * @param {Extent} [dest] Destination extent.\n * @param {number} [stops] Number of stops per side used for the transform.\n * By default only the corners are used.\n * @return {Extent} Extent.\n * @api\n */\nexport function applyTransform(extent, transformFn, dest, stops) {\n if (isEmpty(extent)) {\n return createOrUpdateEmpty(dest);\n }\n let coordinates = [];\n if (stops > 1) {\n const width = extent[2] - extent[0];\n const height = extent[3] - extent[1];\n for (let i = 0; i < stops; ++i) {\n coordinates.push(\n extent[0] + (width * i) / stops,\n extent[1],\n extent[2],\n extent[1] + (height * i) / stops,\n extent[2] - (width * i) / stops,\n extent[3],\n extent[0],\n extent[3] - (height * i) / stops,\n );\n }\n } else {\n coordinates = [\n extent[0],\n extent[1],\n extent[2],\n extent[1],\n extent[2],\n extent[3],\n extent[0],\n extent[3],\n ];\n }\n transformFn(coordinates, coordinates, 2);\n const xs = [];\n const ys = [];\n for (let i = 0, l = coordinates.length; i < l; i += 2) {\n xs.push(coordinates[i]);\n ys.push(coordinates[i + 1]);\n }\n return _boundingExtentXYs(xs, ys, dest);\n}\n\n/**\n * Modifies the provided extent in-place to be within the real world\n * extent.\n *\n * @param {Extent} extent Extent.\n * @param {import(\"./proj/Projection.js\").default} projection Projection\n * @return {Extent} The extent within the real world extent.\n */\nexport function wrapX(extent, projection) {\n const projectionExtent = projection.getExtent();\n const center = getCenter(extent);\n if (\n projection.canWrapX() &&\n (center[0] < projectionExtent[0] || center[0] >= projectionExtent[2])\n ) {\n const worldWidth = getWidth(projectionExtent);\n const worldsAway = Math.floor(\n (center[0] - projectionExtent[0]) / worldWidth,\n );\n const offset = worldsAway * worldWidth;\n extent[0] -= offset;\n extent[2] -= offset;\n }\n return extent;\n}\n\n/**\n * Fits the extent to the real world\n *\n * If the extent does not cross the anti meridian, this will return the extent in an array\n * If the extent crosses the anti meridian, the extent will be sliced, so each part fits within the\n * real world\n *\n *\n * @param {Extent} extent Extent.\n * @param {import(\"./proj/Projection.js\").default} projection Projection\n * @param {boolean} [multiWorld] Return all worlds\n * @return {Array} The extent within the real world extent.\n */\nexport function wrapAndSliceX(extent, projection, multiWorld) {\n if (projection.canWrapX()) {\n const projectionExtent = projection.getExtent();\n\n if (!isFinite(extent[0]) || !isFinite(extent[2])) {\n return [[projectionExtent[0], extent[1], projectionExtent[2], extent[3]]];\n }\n\n wrapX(extent, projection);\n const worldWidth = getWidth(projectionExtent);\n\n if (getWidth(extent) > worldWidth && !multiWorld) {\n // the extent wraps around on itself\n return [[projectionExtent[0], extent[1], projectionExtent[2], extent[3]]];\n }\n if (extent[0] < projectionExtent[0]) {\n // the extent crosses the anti meridian, so it needs to be sliced\n return [\n [extent[0] + worldWidth, extent[1], projectionExtent[2], extent[3]],\n [projectionExtent[0], extent[1], extent[2], extent[3]],\n ];\n }\n if (extent[2] > projectionExtent[2]) {\n // the extent crosses the anti meridian, so it needs to be sliced\n return [\n [extent[0], extent[1], projectionExtent[2], extent[3]],\n [projectionExtent[0], extent[1], extent[2] - worldWidth, extent[3]],\n ];\n }\n }\n\n return [extent];\n}\n\n/**\n * Subtract several rectangles from a base rectangle. Returns a set of disjoint\n * rectangles that together cover the base rectangle minus the union of the\n * subtracted rectangles, by repeatedly applying {@link module:ol/extent.getDifference}.\n * @param {Extent} base Base rectangle.\n * @param {Array} subtract Rectangles to subtract.\n * @return {Array} Remainder rectangles.\n */\nexport function subtractExtents(base, subtract) {\n let remainder = [base];\n for (let i = 0, ii = subtract.length; i < ii && remainder.length > 0; ++i) {\n /** @type {Array} */\n const next = [];\n for (let j = 0, jj = remainder.length; j < jj; ++j) {\n next.push(...getDifference(remainder[j], subtract[i]));\n }\n remainder = next;\n }\n return remainder;\n}\n","/**\n * @module ol/coordinate\n */\nimport {getWidth} from './extent.js';\nimport {clamp, modulo, toFixed} from './math.js';\nimport {padNumber} from './string.js';\n\n/**\n * An array of numbers representing an `xy`, `xyz` or `xyzm` coordinate.\n * Example: `[16, 48]`.\n * @typedef {Array} Coordinate\n * @api\n */\n\n/**\n * A function that takes a {@link module:ol/coordinate~Coordinate} and\n * transforms it into a `{string}`.\n *\n * @typedef {function((Coordinate|undefined)): string} CoordinateFormat\n * @api\n */\n\n/**\n * Add `delta` to `coordinate`. `coordinate` is modified in place and returned\n * by the function.\n *\n * Example:\n *\n * import {add} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * add(coord, [-2, 4]);\n * // coord is now [5.85, 51.983333]\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {Coordinate} delta Delta.\n * @return {Coordinate} The input coordinate adjusted by\n * the given delta.\n * @api\n */\nexport function add(coordinate, delta) {\n coordinate[0] += +delta[0];\n coordinate[1] += +delta[1];\n return coordinate;\n}\n\n/**\n * Calculates the point closest to the passed coordinate on the passed circle.\n *\n * @param {Coordinate} coordinate The coordinate.\n * @param {import(\"./geom/Circle.js\").default} circle The circle.\n * @return {Coordinate} Closest point on the circumference.\n */\nexport function closestOnCircle(coordinate, circle) {\n const r = circle.getRadius();\n const center = circle.getCenter();\n const x0 = center[0];\n const y0 = center[1];\n const x1 = coordinate[0];\n const y1 = coordinate[1];\n\n let dx = x1 - x0;\n const dy = y1 - y0;\n if (dx === 0 && dy === 0) {\n dx = 1;\n }\n const d = Math.sqrt(dx * dx + dy * dy);\n\n const x = x0 + (r * dx) / d;\n const y = y0 + (r * dy) / d;\n\n return [x, y];\n}\n\n/**\n * Calculates the point closest to the passed coordinate on the passed segment.\n * This is the foot of the perpendicular of the coordinate to the segment when\n * the foot is on the segment, or the closest segment coordinate when the foot\n * is outside the segment.\n *\n * @param {Coordinate} coordinate The coordinate.\n * @param {Array} segment The two coordinates\n * of the segment.\n * @return {Coordinate} The foot of the perpendicular of\n * the coordinate to the segment.\n */\nexport function closestOnSegment(coordinate, segment) {\n const x0 = coordinate[0];\n const y0 = coordinate[1];\n const start = segment[0];\n const end = segment[1];\n const x1 = start[0];\n const y1 = start[1];\n const x2 = end[0];\n const y2 = end[1];\n const dx = x2 - x1;\n const dy = y2 - y1;\n const along =\n dx === 0 && dy === 0\n ? 0\n : (dx * (x0 - x1) + dy * (y0 - y1)) / (dx * dx + dy * dy || 0);\n let x, y;\n if (along <= 0) {\n x = x1;\n y = y1;\n } else if (along >= 1) {\n x = x2;\n y = y2;\n } else {\n x = x1 + along * dx;\n y = y1 + along * dy;\n }\n return [x, y];\n}\n\n/**\n * Returns a {@link module:ol/coordinate~CoordinateFormat} function that can be\n * used to format\n * a {Coordinate} to a string.\n *\n * Example without specifying the fractional digits:\n *\n * import {createStringXY} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const stringifyFunc = createStringXY();\n * const out = stringifyFunc(coord);\n * // out is now '8, 48'\n *\n * Example with explicitly specifying 2 fractional digits:\n *\n * import {createStringXY} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const stringifyFunc = createStringXY(2);\n * const out = stringifyFunc(coord);\n * // out is now '7.85, 47.98'\n *\n * @param {number} [fractionDigits] The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {CoordinateFormat} Coordinate format.\n * @api\n */\nexport function createStringXY(fractionDigits) {\n return (\n /**\n * @param {Coordinate} coordinate Coordinate.\n * @return {string} String XY.\n */\n function (coordinate) {\n return toStringXY(coordinate, fractionDigits);\n }\n );\n}\n\n/**\n * @param {string} hemispheres Hemispheres.\n * @param {number} degrees Degrees.\n * @param {number} [fractionDigits] The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} String.\n */\nexport function degreesToStringHDMS(hemispheres, degrees, fractionDigits) {\n const normalizedDegrees = modulo(degrees + 180, 360) - 180;\n const x = Math.abs(3600 * normalizedDegrees);\n const decimals = fractionDigits || 0;\n\n let deg = Math.floor(x / 3600);\n let min = Math.floor((x - deg * 3600) / 60);\n let sec = toFixed(x - deg * 3600 - min * 60, decimals);\n\n if (sec >= 60) {\n sec = 0;\n min += 1;\n }\n\n if (min >= 60) {\n min = 0;\n deg += 1;\n }\n\n let hdms = deg + '\\u00b0';\n if (min !== 0 || sec !== 0) {\n hdms += ' ' + padNumber(min, 2) + '\\u2032';\n }\n if (sec !== 0) {\n hdms += ' ' + padNumber(sec, 2, decimals) + '\\u2033';\n }\n if (normalizedDegrees !== 0) {\n hdms += ' ' + hemispheres.charAt(normalizedDegrees < 0 ? 1 : 0);\n }\n\n return hdms;\n}\n\n/**\n * Transforms the given {@link module:ol/coordinate~Coordinate} to a string\n * using the given string template. The strings `{x}` and `{y}` in the template\n * will be replaced with the first and second coordinate values respectively.\n *\n * Example without specifying the fractional digits:\n *\n * import {format} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const template = 'Coordinate is ({x}|{y}).';\n * const out = format(coord, template);\n * // out is now 'Coordinate is (8|48).'\n *\n * Example explicitly specifying the fractional digits:\n *\n * import {format} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const template = 'Coordinate is ({x}|{y}).';\n * const out = format(coord, template, 2);\n * // out is now 'Coordinate is (7.85|47.98).'\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {string} template A template string with `{x}` and `{y}` placeholders\n * that will be replaced by first and second coordinate values.\n * @param {number} [fractionDigits] The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} Formatted coordinate.\n * @api\n */\nexport function format(coordinate, template, fractionDigits) {\n if (coordinate) {\n return template\n .replace('{x}', coordinate[0].toFixed(fractionDigits))\n .replace('{y}', coordinate[1].toFixed(fractionDigits));\n }\n return '';\n}\n\n/**\n * @param {Coordinate} coordinate1 First coordinate.\n * @param {Coordinate} coordinate2 Second coordinate.\n * @return {boolean} The two coordinates are equal.\n */\nexport function equals(coordinate1, coordinate2) {\n let equals = true;\n for (let i = coordinate1.length - 1; i >= 0; --i) {\n if (coordinate1[i] != coordinate2[i]) {\n equals = false;\n break;\n }\n }\n return equals;\n}\n\n/**\n * Rotate `coordinate` by `angle`. `coordinate` is modified in place and\n * returned by the function.\n *\n * Example:\n *\n * import {rotate} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const rotateRadians = Math.PI / 2; // 90 degrees\n * rotate(coord, rotateRadians);\n * // coord is now [-47.983333, 7.85]\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number} angle Angle in radian.\n * @return {Coordinate} Coordinate.\n * @api\n */\nexport function rotate(coordinate, angle) {\n const cosAngle = Math.cos(angle);\n const sinAngle = Math.sin(angle);\n const x = coordinate[0] * cosAngle - coordinate[1] * sinAngle;\n const y = coordinate[1] * cosAngle + coordinate[0] * sinAngle;\n coordinate[0] = x;\n coordinate[1] = y;\n return coordinate;\n}\n\n/**\n * Scale `coordinate` by `scale`. `coordinate` is modified in place and returned\n * by the function.\n *\n * Example:\n *\n * import {scale as scaleCoordinate} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const scale = 1.2;\n * scaleCoordinate(coord, scale);\n * // coord is now [9.42, 57.5799996]\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number} scale Scale factor.\n * @return {Coordinate} Coordinate.\n */\nexport function scale(coordinate, scale) {\n coordinate[0] *= scale;\n coordinate[1] *= scale;\n return coordinate;\n}\n\n/**\n * @param {Coordinate} coord1 First coordinate.\n * @param {Coordinate} coord2 Second coordinate.\n * @return {number} Squared distance between coord1 and coord2.\n */\nexport function squaredDistance(coord1, coord2) {\n const dx = coord1[0] - coord2[0];\n const dy = coord1[1] - coord2[1];\n return dx * dx + dy * dy;\n}\n\n/**\n * @param {Coordinate} coord1 First coordinate.\n * @param {Coordinate} coord2 Second coordinate.\n * @return {number} Distance between coord1 and coord2.\n */\nexport function distance(coord1, coord2) {\n return Math.sqrt(squaredDistance(coord1, coord2));\n}\n\n/**\n * Calculate the squared distance from a coordinate to a line segment.\n *\n * @param {Coordinate} coordinate Coordinate of the point.\n * @param {Array} segment Line segment (2\n * coordinates).\n * @return {number} Squared distance from the point to the line segment.\n */\nexport function squaredDistanceToSegment(coordinate, segment) {\n return squaredDistance(coordinate, closestOnSegment(coordinate, segment));\n}\n\n/**\n * Format a geographic coordinate with the hemisphere, degrees, minutes, and\n * seconds.\n *\n * Example without specifying fractional digits:\n *\n * import {toStringHDMS} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const out = toStringHDMS(coord);\n * // out is now '47° 58′ 60″ N 7° 50′ 60″ E'\n *\n * Example explicitly specifying 1 fractional digit:\n *\n * import {toStringHDMS} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const out = toStringHDMS(coord, 1);\n * // out is now '47° 58′ 60.0″ N 7° 50′ 60.0″ E'\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number} [fractionDigits] The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} Hemisphere, degrees, minutes and seconds.\n * @api\n */\nexport function toStringHDMS(coordinate, fractionDigits) {\n if (coordinate) {\n return (\n degreesToStringHDMS('NS', coordinate[1], fractionDigits) +\n ' ' +\n degreesToStringHDMS('EW', coordinate[0], fractionDigits)\n );\n }\n return '';\n}\n\n/**\n * Format a coordinate as a comma delimited string.\n *\n * Example without specifying fractional digits:\n *\n * import {toStringXY} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const out = toStringXY(coord);\n * // out is now '8, 48'\n *\n * Example explicitly specifying 1 fractional digit:\n *\n * import {toStringXY} from 'ol/coordinate.js';\n *\n * const coord = [7.85, 47.983333];\n * const out = toStringXY(coord, 1);\n * // out is now '7.8, 48.0'\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {number} [fractionDigits] The number of digits to include\n * after the decimal point. Default is `0`.\n * @return {string} XY.\n * @api\n */\nexport function toStringXY(coordinate, fractionDigits) {\n return format(coordinate, '{x}, {y}', fractionDigits);\n}\n\n/**\n * Modifies the provided coordinate in-place to be within the real world\n * extent. The lower projection extent boundary is inclusive, the upper one\n * exclusive.\n *\n * @param {Coordinate} coordinate Coordinate.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @return {Coordinate} The coordinate within the real world extent.\n */\nexport function wrapX(coordinate, projection) {\n if (projection.canWrapX()) {\n const worldWidth = getWidth(projection.getExtent());\n const worldsAway = getWorldsAway(coordinate, projection, worldWidth);\n if (worldsAway) {\n coordinate[0] -= worldsAway * worldWidth;\n }\n }\n return coordinate;\n}\n/**\n * @param {Coordinate} coordinate Coordinate.\n * @param {import(\"./proj/Projection.js\").default} projection Projection.\n * @param {number} [sourceExtentWidth] Width of the source extent.\n * @return {number} Offset in world widths.\n */\nexport function getWorldsAway(coordinate, projection, sourceExtentWidth) {\n const projectionExtent = projection.getExtent();\n let worldsAway = 0;\n if (\n projection.canWrapX() &&\n (coordinate[0] < projectionExtent[0] || coordinate[0] > projectionExtent[2])\n ) {\n sourceExtentWidth = sourceExtentWidth || getWidth(projectionExtent);\n worldsAway = Math.floor(\n (coordinate[0] - projectionExtent[0]) / sourceExtentWidth,\n );\n }\n return worldsAway;\n}\n\n/**\n * Compute the angle between p0pA and p0pB\n * @param {Coordinate} p0 Point 0\n * @param {Coordinate} pA Point A\n * @param {Coordinate} pB Point B\n * @return {number} a value in [0, 2PI]\n */\nexport function angleBetween(p0, pA, pB) {\n const lenA = Math.sqrt(\n (pA[0] - p0[0]) * (pA[0] - p0[0]) + (pA[1] - p0[1]) * (pA[1] - p0[1]),\n );\n const tangentA = [(pA[0] - p0[0]) / lenA, (pA[1] - p0[1]) / lenA];\n const orthoA = [-tangentA[1], tangentA[0]];\n const lenB = Math.sqrt(\n (pB[0] - p0[0]) * (pB[0] - p0[0]) + (pB[1] - p0[1]) * (pB[1] - p0[1]),\n );\n const tangentB = [(pB[0] - p0[0]) / lenB, (pB[1] - p0[1]) / lenB];\n\n // this angle can be clockwise or anticlockwise; hence the computation afterwards\n let angle =\n lenA === 0 || lenB === 0\n ? 0\n : Math.acos(\n clamp(tangentB[0] * tangentA[0] + tangentB[1] * tangentA[1], -1, 1),\n );\n angle = Math.max(angle, 0.00001); // avoid a zero angle otherwise this is detected as a line cap\n const isClockwise = tangentB[0] * orthoA[0] + tangentB[1] * orthoA[1] > 0;\n return !isClockwise ? Math.PI * 2 - angle : angle;\n}\n","/**\n * @module ol/easing\n */\n\n/**\n * Start slow and speed up.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\nexport function easeIn(t) {\n return Math.pow(t, 3);\n}\n\n/**\n * Start fast and slow down.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\nexport function easeOut(t) {\n return 1 - easeIn(1 - t);\n}\n\n/**\n * Start slow, speed up, and then slow down again.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\nexport function inAndOut(t) {\n return 3 * t * t - 2 * t * t * t;\n}\n\n/**\n * Maintain a constant speed over time.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\nexport function linear(t) {\n return t;\n}\n\n/**\n * Start slow, speed up, and at the very end slow down again. This has the\n * same general behavior as {@link module:ol/easing.inAndOut}, but the final\n * slowdown is delayed.\n * @param {number} t Input between 0 and 1.\n * @return {number} Output between 0 and 1.\n * @api\n */\nexport function upAndDown(t) {\n if (t < 0.5) {\n return inAndOut(2 * t);\n }\n return 1 - inAndOut(2 * (t - 0.5));\n}\n","/**\n * @module ol/sphere\n */\nimport {toDegrees, toRadians} from './math.js';\n\n/**\n * Object literal with options for the {@link getLength} or {@link getArea}\n * functions.\n * @typedef {Object} SphereMetricOptions\n * @property {import(\"./proj.js\").ProjectionLike} [projection='EPSG:3857']\n * Projection of the geometry. By default, the geometry is assumed to be in\n * Web Mercator.\n * @property {number} [radius=6371008.8] Sphere radius. By default, the\n * [mean Earth radius](https://en.wikipedia.org/wiki/Earth_radius#Mean_radius)\n * for the WGS84 ellipsoid is used.\n */\n\n/**\n * The mean Earth radius (1/3 * (2a + b)) for the WGS84 ellipsoid.\n * https://en.wikipedia.org/wiki/Earth_radius#Mean_radius\n * @type {number}\n */\nexport const DEFAULT_RADIUS = 6371008.8;\n\n/**\n * Get the great circle distance (in meters) between two geographic coordinates.\n * @param {Array} c1 Starting coordinate.\n * @param {Array} c2 Ending coordinate.\n * @param {number} [radius] The sphere radius to use. Defaults to the Earth's\n * mean radius using the WGS84 ellipsoid.\n * @return {number} The great circle distance between the points (in meters).\n * @api\n */\nexport function getDistance(c1, c2, radius) {\n radius = radius || DEFAULT_RADIUS;\n const lat1 = toRadians(c1[1]);\n const lat2 = toRadians(c2[1]);\n const deltaLatBy2 = (lat2 - lat1) / 2;\n const deltaLonBy2 = toRadians(c2[0] - c1[0]) / 2;\n const a =\n Math.sin(deltaLatBy2) * Math.sin(deltaLatBy2) +\n Math.sin(deltaLonBy2) *\n Math.sin(deltaLonBy2) *\n Math.cos(lat1) *\n Math.cos(lat2);\n return 2 * radius * Math.atan2(Math.sqrt(a), Math.sqrt(1 - a));\n}\n\n/**\n * Get the cumulative great circle length of linestring coordinates (geographic).\n * @param {Array} coordinates Linestring coordinates.\n * @param {number} radius The sphere radius to use.\n * @return {number} The length (in meters).\n */\nfunction getLengthInternal(coordinates, radius) {\n let length = 0;\n for (let i = 0, ii = coordinates.length; i < ii - 1; ++i) {\n length += getDistance(coordinates[i], coordinates[i + 1], radius);\n }\n return length;\n}\n\n/**\n * Get the spherical length of a geometry. This length is the sum of the\n * great circle distances between coordinates. For polygons, the length is\n * the sum of all rings. For points, the length is zero. For multi-part\n * geometries, the length is the sum of the length of each part.\n * @param {import(\"./geom/Geometry.js\").default} geometry A geometry.\n * @param {SphereMetricOptions} [options] Options for the\n * length calculation. By default, geometries are assumed to be in 'EPSG:3857'.\n * You can change this by providing a `projection` option.\n * @return {number} The spherical length (in meters).\n * @api\n */\nexport function getLength(geometry, options) {\n options = options || {};\n const radius = options.radius || DEFAULT_RADIUS;\n const projection = options.projection || 'EPSG:3857';\n const type = geometry.getType();\n if (type !== 'GeometryCollection') {\n geometry = geometry.clone().transform(projection, 'EPSG:4326');\n }\n let length = 0;\n let coordinates, coords, i, ii, j, jj;\n switch (type) {\n case 'Point':\n case 'MultiPoint': {\n break;\n }\n case 'LineString':\n case 'LinearRing': {\n coordinates = /** @type {import(\"./geom/SimpleGeometry.js\").default} */ (\n geometry\n ).getCoordinates();\n length = getLengthInternal(coordinates, radius);\n break;\n }\n case 'MultiLineString':\n case 'Polygon': {\n coordinates = /** @type {import(\"./geom/SimpleGeometry.js\").default} */ (\n geometry\n ).getCoordinates();\n for (i = 0, ii = coordinates.length; i < ii; ++i) {\n length += getLengthInternal(coordinates[i], radius);\n }\n break;\n }\n case 'MultiPolygon': {\n coordinates = /** @type {import(\"./geom/SimpleGeometry.js\").default} */ (\n geometry\n ).getCoordinates();\n for (i = 0, ii = coordinates.length; i < ii; ++i) {\n coords = coordinates[i];\n for (j = 0, jj = coords.length; j < jj; ++j) {\n length += getLengthInternal(coords[j], radius);\n }\n }\n break;\n }\n case 'GeometryCollection': {\n const geometries =\n /** @type {import(\"./geom/GeometryCollection.js\").default} */ (\n geometry\n ).getGeometries();\n for (i = 0, ii = geometries.length; i < ii; ++i) {\n length += getLength(geometries[i], options);\n }\n break;\n }\n default: {\n throw new Error('Unsupported geometry type: ' + type);\n }\n }\n return length;\n}\n\n/**\n * Returns the spherical area for a list of coordinates.\n *\n * [Reference](https://trs.jpl.nasa.gov/handle/2014/40409)\n * Robert. G. Chamberlain and William H. Duquette, \"Some Algorithms for\n * Polygons on a Sphere\", JPL Publication 07-03, Jet Propulsion\n * Laboratory, Pasadena, CA, June 2007\n *\n * @param {Array} coordinates List of coordinates of a linear\n * ring. If the ring is oriented clockwise, the area will be positive,\n * otherwise it will be negative.\n * @param {number} radius The sphere radius.\n * @return {number} Area (in square meters).\n */\nfunction getAreaInternal(coordinates, radius) {\n let area = 0;\n const len = coordinates.length;\n let x1 = coordinates[len - 1][0];\n let y1 = coordinates[len - 1][1];\n for (let i = 0; i < len; i++) {\n const x2 = coordinates[i][0];\n const y2 = coordinates[i][1];\n area +=\n toRadians(x2 - x1) *\n (2 + Math.sin(toRadians(y1)) + Math.sin(toRadians(y2)));\n x1 = x2;\n y1 = y2;\n }\n return (area * radius * radius) / 2.0;\n}\n\n/**\n * Get the spherical area of a geometry. This is the area (in meters) assuming\n * that polygon edges are segments of great circles on a sphere.\n * @param {import(\"./geom/Geometry.js\").default} geometry A geometry.\n * @param {SphereMetricOptions} [options] Options for the area\n * calculation. By default, geometries are assumed to be in 'EPSG:3857'.\n * You can change this by providing a `projection` option.\n * @return {number} The spherical area (in square meters).\n * @api\n */\nexport function getArea(geometry, options) {\n options = options || {};\n const radius = options.radius || DEFAULT_RADIUS;\n const projection = options.projection || 'EPSG:3857';\n const type = geometry.getType();\n if (type !== 'GeometryCollection') {\n geometry = geometry.clone().transform(projection, 'EPSG:4326');\n }\n let area = 0;\n let coordinates, coords, i, ii, j, jj;\n switch (type) {\n case 'Point':\n case 'MultiPoint':\n case 'LineString':\n case 'MultiLineString':\n case 'LinearRing': {\n break;\n }\n case 'Polygon': {\n coordinates = /** @type {import(\"./geom/Polygon.js\").default} */ (\n geometry\n ).getCoordinates();\n area = Math.abs(getAreaInternal(coordinates[0], radius));\n for (i = 1, ii = coordinates.length; i < ii; ++i) {\n area -= Math.abs(getAreaInternal(coordinates[i], radius));\n }\n break;\n }\n case 'MultiPolygon': {\n coordinates = /** @type {import(\"./geom/SimpleGeometry.js\").default} */ (\n geometry\n ).getCoordinates();\n for (i = 0, ii = coordinates.length; i < ii; ++i) {\n coords = coordinates[i];\n area += Math.abs(getAreaInternal(coords[0], radius));\n for (j = 1, jj = coords.length; j < jj; ++j) {\n area -= Math.abs(getAreaInternal(coords[j], radius));\n }\n }\n break;\n }\n case 'GeometryCollection': {\n const geometries =\n /** @type {import(\"./geom/GeometryCollection.js\").default} */ (\n geometry\n ).getGeometries();\n for (i = 0, ii = geometries.length; i < ii; ++i) {\n area += getArea(geometries[i], options);\n }\n break;\n }\n default: {\n throw new Error('Unsupported geometry type: ' + type);\n }\n }\n return area;\n}\n\n/**\n * Returns the coordinate at the given distance and bearing from `c1`.\n *\n * @param {import(\"./coordinate.js\").Coordinate} c1 The origin point (`[lon, lat]` in degrees).\n * @param {number} distance The great-circle distance between the origin\n * point and the target point.\n * @param {number} bearing The bearing (in radians).\n * @param {number} [radius] The sphere radius to use. Defaults to the Earth's\n * mean radius using the WGS84 ellipsoid.\n * @return {import(\"./coordinate.js\").Coordinate} The target point.\n */\nexport function offset(c1, distance, bearing, radius) {\n radius = radius || DEFAULT_RADIUS;\n const lat1 = toRadians(c1[1]);\n const lon1 = toRadians(c1[0]);\n const dByR = distance / radius;\n const lat = Math.asin(\n Math.sin(lat1) * Math.cos(dByR) +\n Math.cos(lat1) * Math.sin(dByR) * Math.cos(bearing),\n );\n const lon =\n lon1 +\n Math.atan2(\n Math.sin(bearing) * Math.sin(dByR) * Math.cos(lat1),\n Math.cos(dByR) - Math.sin(lat1) * Math.sin(lat),\n );\n return [toDegrees(lon), toDegrees(lat)];\n}\n","/**\n * @module ol/console\n */\n\n/**\n * @typedef {'info'|'warn'|'error'|'none'} Level\n */\n\n/**\n * @type {Object}\n */\nconst levels = {\n info: 1,\n warn: 2,\n error: 3,\n none: 4,\n};\n\n/**\n * @type {number}\n */\nlet level = levels.info;\n\n/**\n * Set the logging level. By default, the level is set to 'info' and all\n * messages will be logged. Set to 'warn' to only display warnings and errors.\n * Set to 'error' to only display errors. Set to 'none' to silence all messages.\n *\n * @param {Level} l The new level.\n */\nexport function setLevel(l) {\n level = levels[l];\n}\n\n/**\n * @param {...any} args Arguments to log\n */\nexport function log(...args) {\n if (level > levels.info) {\n return;\n }\n console.log(...args); // eslint-disable-line no-console\n}\n\n/**\n * @param {...any} args Arguments to log\n */\nexport function warn(...args) {\n if (level > levels.warn) {\n return;\n }\n console.warn(...args); // eslint-disable-line no-console\n}\n\n/**\n * @param {...any} args Arguments to log\n */\nexport function error(...args) {\n if (level > levels.error) {\n return;\n }\n console.error(...args); // eslint-disable-line no-console\n}\n","/**\n * @module ol/proj/Units\n */\n\n/**\n * @typedef {'radians' | 'degrees' | 'ft' | 'm' | 'pixels' | 'tile-pixels' | 'us-ft'} Units\n * Projection units.\n */\n\n/**\n * See http://duff.ess.washington.edu/data/raster/drg/docs/geotiff.txt\n * @type {Object}\n */\nconst unitByCode = {\n '9001': 'm',\n '9002': 'ft',\n '9003': 'us-ft',\n '9101': 'radians',\n '9102': 'degrees',\n};\n\n/**\n * @param {number} code Unit code.\n * @return {Units} Units.\n */\nexport function fromCode(code) {\n return unitByCode[code];\n}\n\n/**\n * @typedef {Object} MetersPerUnitLookup\n * @property {number} radians Radians\n * @property {number} degrees Degrees\n * @property {number} ft Feet\n * @property {number} m Meters\n * @property {number} us-ft US feet\n */\n\n/**\n * Meters per unit lookup table.\n * @const\n * @type {MetersPerUnitLookup}\n * @api\n */\nexport const METERS_PER_UNIT = {\n // use the radius of the Normal sphere\n 'radians': 6370997 / (2 * Math.PI),\n 'degrees': (2 * Math.PI * 6370997) / 360,\n 'ft': 0.3048,\n 'm': 1,\n 'us-ft': 1200 / 3937,\n};\n","/**\n * @module ol/proj/Projection\n */\nimport {METERS_PER_UNIT} from './Units.js';\n\n/**\n * The function is called with a `number` view resolution and a\n * {@link module:ol/coordinate~Coordinate} as arguments, and returns the `number` resolution\n * in projection units at the passed coordinate.\n * @typedef {function(number, import(\"../coordinate.js\").Coordinate):number} GetPointResolution\n * @api\n */\n\n/**\n * @typedef {Object} Options\n * @property {string} code The SRS identifier code, e.g. `EPSG:4326`.\n * @property {import(\"./Units.js\").Units} [units] Units. Required unless a\n * proj4 projection is defined for `code`.\n * @property {import(\"../extent.js\").Extent} [extent] The validity extent for the SRS.\n * @property {string} [axisOrientation='enu'] The axis orientation as specified in Proj4.\n * @property {boolean} [global=false] Whether the projection is valid for the whole globe.\n * @property {number} [metersPerUnit] The meters per unit for the SRS.\n * If not provided, the `units` are used to get the meters per unit from the {@link METERS_PER_UNIT}\n * lookup table.\n * @property {import(\"../extent.js\").Extent} [worldExtent] The world extent for the SRS.\n * @property {GetPointResolution} [getPointResolution]\n * Function to determine resolution at a point. The function is called with a\n * `number` view resolution and a {@link module:ol/coordinate~Coordinate} as arguments, and returns\n * the `number` resolution in projection units at the passed coordinate. If this is `undefined`,\n * the default {@link module:ol/proj.getPointResolution} function will be used.\n */\n\n/**\n * @classdesc\n * In most cases, you should not need to create instances of this class.\n * Instead, where projection information is required, you can use a string\n * projection code or identifier (e.g. `EPSG:4326`) instead of a projection\n * instance.\n *\n * The library includes support for transforming coordinates between the following\n * projections:\n *\n * WGS 84 / Geographic - Using codes `EPSG:4326`, `CRS:84`, `urn:ogc:def:crs:EPSG:6.6:4326`,\n * `urn:ogc:def:crs:OGC:1.3:CRS84`, `urn:ogc:def:crs:OGC:2:84`, `http://www.opengis.net/gml/srs/epsg.xml#4326`,\n * or `urn:x-ogc:def:crs:EPSG:4326`\n * WGS 84 / Spherical Mercator - Using codes `EPSG:3857`, `EPSG:102100`, `EPSG:102113`, `EPSG:900913`,\n * `urn:ogc:def:crs:EPSG:6.18:3:3857`, or `http://www.opengis.net/gml/srs/epsg.xml#3857`\n * WGS 84 / UTM zones - Using codes `EPSG:32601` through `EPSG:32660` for northern zones\n * and `EPSG:32701` through `EPSG:32760` for southern zones. Note that the built-in UTM transforms\n * are lower accuracy (with errors on the order of 0.1 m) than those that you might get in a\n * library like [proj4js](https://github.com/proj4js/proj4js).\n *\n * For additional projection support, or to use higher accuracy transforms than the built-in ones, you can use\n * the [proj4js](https://github.com/proj4js/proj4js) library. With `proj4js`, after adding any new projection\n * definitions, call the {@link module:ol/proj/proj4.register} function.\n *\n * You can use the {@link module:ol/proj.get} function to retrieve a projection instance\n * for one of the registered projections.\n *\n * @api\n */\nclass Projection {\n /**\n * @param {Options} options Projection options.\n */\n constructor(options) {\n /**\n * @private\n * @type {string}\n */\n this.code_ = options.code;\n\n /**\n * Units of projected coordinates. When set to `TILE_PIXELS`, a\n * `this.extent_` and `this.worldExtent_` must be configured properly for each\n * tile.\n * @private\n * @type {import(\"./Units.js\").Units}\n */\n this.units_ = /** @type {import(\"./Units.js\").Units} */ (options.units);\n\n /**\n * Validity extent of the projection in projected coordinates. For projections\n * with `TILE_PIXELS` units, this is the extent of the tile in\n * tile pixel space.\n * @private\n * @type {import(\"../extent.js\").Extent}\n */\n this.extent_ = options.extent !== undefined ? options.extent : null;\n\n /**\n * Extent of the world in EPSG:4326. For projections with\n * `TILE_PIXELS` units, this is the extent of the tile in\n * projected coordinate space.\n * @private\n * @type {import(\"../extent.js\").Extent}\n */\n this.worldExtent_ =\n options.worldExtent !== undefined ? options.worldExtent : null;\n\n /**\n * @private\n * @type {string}\n */\n this.axisOrientation_ =\n options.axisOrientation !== undefined ? options.axisOrientation : 'enu';\n\n /**\n * @private\n * @type {boolean}\n */\n this.global_ = options.global !== undefined ? options.global : false;\n\n /**\n * @private\n * @type {boolean}\n */\n this.canWrapX_ = !!(this.global_ && this.extent_);\n\n /**\n * @private\n * @type {GetPointResolution|undefined}\n */\n this.getPointResolutionFunc_ = options.getPointResolution;\n\n /**\n * @private\n * @type {import(\"../tilegrid/TileGrid.js\").default}\n */\n this.defaultTileGrid_ = null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.metersPerUnit_ = options.metersPerUnit;\n }\n\n /**\n * @return {boolean} The projection is suitable for wrapping the x-axis\n */\n canWrapX() {\n return this.canWrapX_;\n }\n\n /**\n * Get the code for this projection, e.g. 'EPSG:4326'.\n * @return {string} Code.\n * @api\n */\n getCode() {\n return this.code_;\n }\n\n /**\n * Get the validity extent for this projection.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getExtent() {\n return this.extent_;\n }\n\n /**\n * Get the units of this projection.\n * @return {import(\"./Units.js\").Units} Units.\n * @api\n */\n getUnits() {\n return this.units_;\n }\n\n /**\n * Get the amount of meters per unit of this projection. If the projection is\n * not configured with `metersPerUnit` or a units identifier, the return is\n * `undefined`.\n * @return {number|undefined} Meters.\n * @api\n */\n getMetersPerUnit() {\n return this.metersPerUnit_ || METERS_PER_UNIT[this.units_];\n }\n\n /**\n * Get the world extent for this projection.\n * @return {import(\"../extent.js\").Extent} Extent.\n * @api\n */\n getWorldExtent() {\n return this.worldExtent_;\n }\n\n /**\n * Get the axis orientation of this projection.\n * Example values are:\n * enu - the default easting, northing, elevation.\n * neu - northing, easting, up - useful for \"lat/long\" geographic coordinates,\n * or south orientated transverse mercator.\n * wnu - westing, northing, up - some planetary coordinate systems have\n * \"west positive\" coordinate systems\n * @return {string} Axis orientation.\n * @api\n */\n getAxisOrientation() {\n return this.axisOrientation_;\n }\n\n /**\n * Is this projection a global projection which spans the whole world?\n * @return {boolean} Whether the projection is global.\n * @api\n */\n isGlobal() {\n return this.global_;\n }\n\n /**\n * Set if the projection is a global projection which spans the whole world\n * @param {boolean} global Whether the projection is global.\n * @api\n */\n setGlobal(global) {\n this.global_ = global;\n this.canWrapX_ = !!(global && this.extent_);\n }\n\n /**\n * @return {import(\"../tilegrid/TileGrid.js\").default} The default tile grid.\n */\n getDefaultTileGrid() {\n return this.defaultTileGrid_;\n }\n\n /**\n * @param {import(\"../tilegrid/TileGrid.js\").default} tileGrid The default tile grid.\n */\n setDefaultTileGrid(tileGrid) {\n this.defaultTileGrid_ = tileGrid;\n }\n\n /**\n * Set the validity extent for this projection.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @api\n */\n setExtent(extent) {\n this.extent_ = extent;\n this.canWrapX_ = !!(this.global_ && extent);\n }\n\n /**\n * Set the world extent for this projection.\n * @param {import(\"../extent.js\").Extent} worldExtent World extent\n * [minlon, minlat, maxlon, maxlat].\n * @api\n */\n setWorldExtent(worldExtent) {\n this.worldExtent_ = worldExtent;\n }\n\n /**\n * Set the getPointResolution function (see {@link module:ol/proj.getPointResolution}\n * for this projection.\n * @param {function(number, import(\"../coordinate.js\").Coordinate):number} func Function\n * @api\n */\n setGetPointResolution(func) {\n this.getPointResolutionFunc_ = func;\n }\n\n /**\n * Get the custom point resolution function for this projection (if set).\n * @return {GetPointResolution|undefined} The custom point\n * resolution function (if set).\n */\n getPointResolutionFunc() {\n return this.getPointResolutionFunc_;\n }\n}\n\nexport default Projection;\n","/**\n * @module ol/proj/epsg3857\n */\nimport Projection from './Projection.js';\n\n/**\n * Radius of WGS84 sphere\n *\n * @const\n * @type {number}\n */\nexport const RADIUS = 6378137;\n\n/**\n * @const\n * @type {number}\n */\nexport const HALF_SIZE = Math.PI * RADIUS;\n\n/**\n * @const\n * @type {import(\"../extent.js\").Extent}\n */\nexport const EXTENT = [-HALF_SIZE, -HALF_SIZE, HALF_SIZE, HALF_SIZE];\n\n/**\n * @const\n * @type {import(\"../extent.js\").Extent}\n */\nexport const WORLD_EXTENT = [-180, -85, 180, 85];\n\n/**\n * Maximum safe value in y direction\n * @const\n * @type {number}\n */\nexport const MAX_SAFE_Y = RADIUS * Math.log(Math.tan(Math.PI / 2));\n\n/**\n * @classdesc\n * Projection object for web/spherical Mercator (EPSG:3857).\n */\nclass EPSG3857Projection extends Projection {\n /**\n * @param {string} code Code.\n */\n constructor(code) {\n super({\n code: code,\n units: 'm',\n extent: EXTENT,\n global: true,\n worldExtent: WORLD_EXTENT,\n getPointResolution: function (resolution, point) {\n return resolution / Math.cosh(point[1] / RADIUS);\n },\n });\n }\n}\n\n/**\n * Projections equal to EPSG:3857.\n *\n * @const\n * @type {Array}\n */\nexport const PROJECTIONS = [\n new EPSG3857Projection('EPSG:3857'),\n new EPSG3857Projection('EPSG:102100'),\n new EPSG3857Projection('EPSG:102113'),\n new EPSG3857Projection('EPSG:900913'),\n new EPSG3857Projection('http://www.opengis.net/def/crs/EPSG/0/3857'),\n new EPSG3857Projection('http://www.opengis.net/gml/srs/epsg.xml#3857'),\n];\n\n/**\n * Transformation from EPSG:4326 to EPSG:3857.\n *\n * @param {Array} input Input array of coordinate values.\n * @param {Array} [output] Output array of coordinate values.\n * @param {number} [dimension] Dimension (default is `2`).\n * @param {number} [stride] Stride (default is `dimension`).\n * @return {Array} Output array of coordinate values.\n */\nexport function fromEPSG4326(input, output, dimension, stride) {\n const length = input.length;\n dimension = dimension > 1 ? dimension : 2;\n stride = stride ?? dimension;\n if (output === undefined) {\n if (dimension > 2) {\n // preserve values beyond second dimension\n output = input.slice();\n } else {\n output = new Array(length);\n }\n }\n for (let i = 0; i < length; i += stride) {\n output[i] = (HALF_SIZE * input[i]) / 180;\n let y = RADIUS * Math.log(Math.tan((Math.PI * (+input[i + 1] + 90)) / 360));\n if (y > MAX_SAFE_Y) {\n y = MAX_SAFE_Y;\n } else if (y < -MAX_SAFE_Y) {\n y = -MAX_SAFE_Y;\n }\n output[i + 1] = y;\n }\n return output;\n}\n\n/**\n * Transformation from EPSG:3857 to EPSG:4326.\n *\n * @param {Array} input Input array of coordinate values.\n * @param {Array} [output] Output array of coordinate values.\n * @param {number} [dimension] Dimension (default is `2`).\n * @param {number} [stride] Stride (default is `dimension`).\n * @return {Array} Output array of coordinate values.\n */\nexport function toEPSG4326(input, output, dimension, stride) {\n const length = input.length;\n dimension = dimension > 1 ? dimension : 2;\n stride = stride ?? dimension;\n if (output === undefined) {\n if (dimension > 2) {\n // preserve values beyond second dimension\n output = input.slice();\n } else {\n output = new Array(length);\n }\n }\n for (let i = 0; i < length; i += stride) {\n output[i] = (180 * input[i]) / HALF_SIZE;\n output[i + 1] =\n (360 * Math.atan(Math.exp(input[i + 1] / RADIUS))) / Math.PI - 90;\n }\n return output;\n}\n","/**\n * @module ol/proj/epsg4326\n */\nimport Projection from './Projection.js';\n\n/**\n * Semi-major radius of the WGS84 ellipsoid.\n *\n * @const\n * @type {number}\n */\nexport const RADIUS = 6378137;\n\n/**\n * Extent of the EPSG:4326 projection which is the whole world.\n *\n * @const\n * @type {import(\"../extent.js\").Extent}\n */\nexport const EXTENT = [-180, -90, 180, 90];\n\n/**\n * @const\n * @type {number}\n */\nexport const METERS_PER_UNIT = (Math.PI * RADIUS) / 180;\n\n/**\n * @classdesc\n * Projection object for WGS84 geographic coordinates (EPSG:4326).\n *\n * Note that OpenLayers does not strictly comply with the EPSG definition.\n * The EPSG registry defines 4326 as a CRS for Latitude,Longitude (y,x).\n * OpenLayers treats EPSG:4326 as a pseudo-projection, with x,y coordinates.\n */\nclass EPSG4326Projection extends Projection {\n /**\n * @param {string} code Code.\n * @param {string} [axisOrientation] Axis orientation.\n */\n constructor(code, axisOrientation) {\n super({\n code: code,\n units: 'degrees',\n extent: EXTENT,\n axisOrientation: axisOrientation,\n global: true,\n metersPerUnit: METERS_PER_UNIT,\n worldExtent: EXTENT,\n });\n }\n}\n\n/**\n * Projections equal to EPSG:4326.\n *\n * @const\n * @type {Array}\n */\nexport const PROJECTIONS = [\n new EPSG4326Projection('CRS:84'),\n new EPSG4326Projection('EPSG:4326', 'neu'),\n new EPSG4326Projection('urn:ogc:def:crs:OGC:1.3:CRS84'),\n new EPSG4326Projection('urn:ogc:def:crs:OGC:2:84'),\n new EPSG4326Projection('http://www.opengis.net/def/crs/OGC/1.3/CRS84'),\n new EPSG4326Projection('http://www.opengis.net/gml/srs/epsg.xml#4326', 'neu'),\n new EPSG4326Projection('http://www.opengis.net/def/crs/EPSG/0/4326', 'neu'),\n];\n","/**\n * @module ol/proj/projections\n */\n\n/**\n * @type {Object}\n */\nlet cache = {};\n\n/**\n * Clear the projections cache.\n */\nexport function clear() {\n cache = {};\n}\n\n/**\n * Get a cached projection by code.\n * @param {string} code The code for the projection.\n * @return {import(\"./Projection.js\").default|null} The projection (if cached).\n */\nexport function get(code) {\n return (\n cache[code] ||\n cache[code.replace(/urn:(x-)?ogc:def:crs:EPSG:(.*:)?(\\w+)$/, 'EPSG:$3')] ||\n null\n );\n}\n\n/**\n * Add a projection to the cache.\n * @param {string} code The projection code.\n * @param {import(\"./Projection.js\").default} projection The projection to cache.\n */\nexport function add(code, projection) {\n cache[code] = projection;\n}\n","/**\n * @module ol/proj/transforms\n */\nimport {isEmpty} from '../obj.js';\n\n/**\n * @private\n * @type {!Object>}\n */\nlet transforms = {};\n\n/**\n * Clear the transform cache.\n */\nexport function clear() {\n transforms = {};\n}\n\n/**\n * Registers a conversion function to convert coordinates from the source\n * projection to the destination projection.\n *\n * @param {import(\"./Projection.js\").default} source Source.\n * @param {import(\"./Projection.js\").default} destination Destination.\n * @param {import(\"../proj.js\").TransformFunction} transformFn Transform.\n */\nexport function add(source, destination, transformFn) {\n const sourceCode = source.getCode();\n const destinationCode = destination.getCode();\n if (!(sourceCode in transforms)) {\n transforms[sourceCode] = {};\n }\n transforms[sourceCode][destinationCode] = transformFn;\n}\n\n/**\n * Unregisters the conversion function to convert coordinates from the source\n * projection to the destination projection. This method is used to clean up\n * cached transforms during testing.\n *\n * @param {import(\"./Projection.js\").default} source Source projection.\n * @param {import(\"./Projection.js\").default} destination Destination projection.\n * @return {import(\"../proj.js\").TransformFunction} transformFn The unregistered transform.\n */\nexport function remove(source, destination) {\n const sourceCode = source.getCode();\n const destinationCode = destination.getCode();\n const transform = transforms[sourceCode][destinationCode];\n delete transforms[sourceCode][destinationCode];\n if (isEmpty(transforms[sourceCode])) {\n delete transforms[sourceCode];\n }\n return transform;\n}\n\n/**\n * Get a transform given a source code and a destination code.\n * @param {string} sourceCode The code for the source projection.\n * @param {string} destinationCode The code for the destination projection.\n * @return {import(\"../proj.js\").TransformFunction|null} The transform function (if found).\n */\nexport function get(sourceCode, destinationCode) {\n if (sourceCode in transforms && destinationCode in transforms[sourceCode]) {\n return transforms[sourceCode][destinationCode];\n }\n return null;\n}\n","/**\n * @module ol/proj/utm\n */\n\n/**\n * Adapted from https://github.com/Turbo87/utm\n * Copyright (c) 2012-2017 Tobias Bieniek\n *\n * The functions here provide approximate transforms to and from UTM.\n * They are not appropriate for use beyond the validity extend of a UTM\n * zone, and the accuracy of the transform decreases toward the zone\n * edges.\n */\n\nimport {toDegrees, toRadians, wrap} from '../math.js';\nimport Projection from './Projection.js';\n\n/**\n * @typedef {Object} UTMZone\n * @property {number} number The zone number (1 - 60).\n * @property {boolean} north The northern hemisphere.\n */\n\nconst K0 = 0.9996;\n\nconst E = 0.00669438;\nconst E2 = E * E;\nconst E3 = E2 * E;\nconst E_P2 = E / (1 - E);\n\nconst SQRT_E = Math.sqrt(1 - E);\nconst _E = (1 - SQRT_E) / (1 + SQRT_E);\nconst _E2 = _E * _E;\nconst _E3 = _E2 * _E;\nconst _E4 = _E3 * _E;\nconst _E5 = _E4 * _E;\n\nconst M1 = 1 - E / 4 - (3 * E2) / 64 - (5 * E3) / 256;\nconst M2 = (3 * E) / 8 + (3 * E2) / 32 + (45 * E3) / 1024;\nconst M3 = (15 * E2) / 256 + (45 * E3) / 1024;\nconst M4 = (35 * E3) / 3072;\n\nconst P2 = (3 / 2) * _E - (27 / 32) * _E3 + (269 / 512) * _E5;\nconst P3 = (21 / 16) * _E2 - (55 / 32) * _E4;\nconst P4 = (151 / 96) * _E3 - (417 / 128) * _E5;\nconst P5 = (1097 / 512) * _E4;\n\nconst R = 6378137;\n\n/**\n * @param {number} easting Easting value of coordinate.\n * @param {number} northing Northing value of coordinate.\n * @param {UTMZone} zone The UTM zone.\n * @return {import(\"../coordinate.js\").Coordinate} The transformed coordinate.\n */\nfunction toLonLat(easting, northing, zone) {\n const x = easting - 500000;\n const y = zone.north ? northing : northing - 10000000;\n\n const m = y / K0;\n const mu = m / (R * M1);\n\n const pRad =\n mu +\n P2 * Math.sin(2 * mu) +\n P3 * Math.sin(4 * mu) +\n P4 * Math.sin(6 * mu) +\n P5 * Math.sin(8 * mu);\n\n const pSin = Math.sin(pRad);\n const pSin2 = pSin * pSin;\n\n const pCos = Math.cos(pRad);\n\n const pTan = pSin / pCos;\n const pTan2 = pTan * pTan;\n const pTan4 = pTan2 * pTan2;\n\n const epSin = 1 - E * pSin2;\n const epSinSqrt = Math.sqrt(1 - E * pSin2);\n\n const n = R / epSinSqrt;\n const r = (1 - E) / epSin;\n\n const c = E_P2 * pCos ** 2;\n const c2 = c * c;\n\n const d = x / (n * K0);\n const d2 = d * d;\n const d3 = d2 * d;\n const d4 = d3 * d;\n const d5 = d4 * d;\n const d6 = d5 * d;\n\n const latitude =\n pRad -\n (pTan / r) *\n (d2 / 2 - (d4 / 24) * (5 + 3 * pTan2 + 10 * c - 4 * c2 - 9 * E_P2)) +\n (d6 / 720) * (61 + 90 * pTan2 + 298 * c + 45 * pTan4 - 252 * E_P2 - 3 * c2);\n\n let longitude =\n (d -\n (d3 / 6) * (1 + 2 * pTan2 + c) +\n (d5 / 120) * (5 - 2 * c + 28 * pTan2 - 3 * c2 + 8 * E_P2 + 24 * pTan4)) /\n pCos;\n\n longitude = wrap(\n longitude + toRadians(zoneToCentralLongitude(zone.number)),\n -Math.PI,\n Math.PI,\n );\n\n return [toDegrees(longitude), toDegrees(latitude)];\n}\n\nconst MIN_LATITUDE = -80;\nconst MAX_LATITUDE = 84;\nconst MIN_LONGITUDE = -180;\nconst MAX_LONGITUDE = 180;\n\n/**\n * @param {number} longitude The longitude.\n * @param {number} latitude The latitude.\n * @param {UTMZone} zone The UTM zone.\n * @return {import('../coordinate.js').Coordinate} The UTM coordinate.\n */\nfunction fromLonLat(longitude, latitude, zone) {\n longitude = wrap(longitude, MIN_LONGITUDE, MAX_LONGITUDE);\n\n if (latitude < MIN_LATITUDE) {\n latitude = MIN_LATITUDE;\n } else if (latitude > MAX_LATITUDE) {\n latitude = MAX_LATITUDE;\n }\n\n const latRad = toRadians(latitude);\n const latSin = Math.sin(latRad);\n const latCos = Math.cos(latRad);\n\n const latTan = latSin / latCos;\n const latTan2 = latTan * latTan;\n const latTan4 = latTan2 * latTan2;\n\n const lonRad = toRadians(longitude);\n const centralLon = zoneToCentralLongitude(zone.number);\n const centralLonRad = toRadians(centralLon);\n\n const n = R / Math.sqrt(1 - E * latSin ** 2);\n const c = E_P2 * latCos ** 2;\n\n const a = latCos * wrap(lonRad - centralLonRad, -Math.PI, Math.PI);\n const a2 = a * a;\n const a3 = a2 * a;\n const a4 = a3 * a;\n const a5 = a4 * a;\n const a6 = a5 * a;\n\n const m =\n R *\n (M1 * latRad -\n M2 * Math.sin(2 * latRad) +\n M3 * Math.sin(4 * latRad) -\n M4 * Math.sin(6 * latRad));\n\n const easting =\n K0 *\n n *\n (a +\n (a3 / 6) * (1 - latTan2 + c) +\n (a5 / 120) * (5 - 18 * latTan2 + latTan4 + 72 * c - 58 * E_P2)) +\n 500000;\n\n let northing =\n K0 *\n (m +\n n *\n latTan *\n (a2 / 2 +\n (a4 / 24) * (5 - latTan2 + 9 * c + 4 * c ** 2) +\n (a6 / 720) * (61 - 58 * latTan2 + latTan4 + 600 * c - 330 * E_P2)));\n\n if (!zone.north) {\n northing += 10000000;\n }\n\n return [easting, northing];\n}\n\n/**\n * @param {number} zone The zone number.\n * @return {number} The central longitude in degrees.\n */\nfunction zoneToCentralLongitude(zone) {\n return (zone - 1) * 6 - 180 + 3;\n}\n\n/**\n * @type {Array}\n */\nconst epsgRegExes = [\n /^EPSG:(\\d+)$/,\n /^urn:ogc:def:crs:EPSG::(\\d+)$/,\n /^http:\\/\\/www\\.opengis\\.net\\/def\\/crs\\/EPSG\\/0\\/(\\d+)$/,\n];\n\n/**\n * @param {string} code The projection code.\n * @return {UTMZone|null} The UTM zone info (or null if not UTM).\n */\nexport function zoneFromCode(code) {\n let epsgId = 0;\n for (const re of epsgRegExes) {\n const match = code.match(re);\n if (match) {\n epsgId = parseInt(match[1]);\n break;\n }\n }\n if (!epsgId) {\n return null;\n }\n\n let number = 0;\n let north = false;\n if (epsgId > 32700 && epsgId < 32761) {\n number = epsgId - 32700;\n } else if (epsgId > 32600 && epsgId < 32661) {\n north = true;\n number = epsgId - 32600;\n }\n if (!number) {\n return null;\n }\n\n return {number, north};\n}\n\n/**\n * @param {function(number, number, UTMZone): import('../coordinate.js').Coordinate} transformer The transformer.\n * @param {UTMZone} zone The UTM zone.\n * @return {import('../proj.js').TransformFunction} The transform function.\n */\nfunction makeTransformFunction(transformer, zone) {\n return function (input, output, dimension, stride) {\n const length = input.length;\n dimension = dimension > 1 ? dimension : 2;\n stride = stride ?? dimension;\n if (!output) {\n if (dimension > 2) {\n output = input.slice();\n } else {\n output = new Array(length);\n }\n }\n for (let i = 0; i < length; i += stride) {\n const x = input[i];\n const y = input[i + 1];\n const coord = transformer(x, y, zone);\n output[i] = coord[0];\n output[i + 1] = coord[1];\n }\n return output;\n };\n}\n\n/**\n * @param {string} code The projection code.\n * @return {import('./Projection.js').default|null} A projection or null if unable to create one.\n */\nexport function makeProjection(code) {\n const zone = zoneFromCode(code);\n if (!zone) {\n return null;\n }\n return new Projection({code, units: 'm'});\n}\n\n/**\n * @param {import('./Projection.js').default} projection The projection.\n * @return {import('../proj.js').Transforms|null} The transforms lookup or null if unable to handle projection.\n */\nexport function makeTransforms(projection) {\n const zone = zoneFromCode(projection.getCode());\n if (!zone) {\n return null;\n }\n\n return {\n forward: makeTransformFunction(fromLonLat, zone),\n inverse: makeTransformFunction(toLonLat, zone),\n };\n}\n","/**\n * @module ol/proj\n */\n\n/**\n * The ol/proj module stores:\n * a list of {@link module:ol/proj/Projection~Projection}\n * objects, one for each projection supported by the application\n * a list of transform functions needed to convert coordinates in one projection\n * into another.\n *\n * The static functions are the methods used to maintain these.\n * Each transform function can handle not only simple coordinate pairs, but also\n * large arrays of coordinates such as vector geometries.\n *\n * When loaded, the library adds projection objects for EPSG:4326 (WGS84\n * geographic coordinates) and EPSG:3857 (Web or Spherical Mercator, as used\n * for example by Bing Maps or OpenStreetMap), together with the relevant\n * transform functions.\n *\n * Additional transforms may be added by using the http://proj4js.org/\n * library (version 2.2 or later). You can use the full build supplied by\n * Proj4js, or create a custom build to support those projections you need; see\n * the Proj4js website for how to do this. You also need the Proj4js definitions\n * for the required projections. These definitions can be obtained from\n * https://spatialreference.org/, and are a JS function, so can be loaded in a\n * script tag (as in the examples) or pasted into your application.\n *\n * After all required projection definitions are added to proj4's registry (by\n * using `proj4.defs()`), simply call `register(proj4)` from the `ol/proj/proj4`\n * package. Existing transforms are not changed by this function. See\n * examples/wms-image-custom-proj for an example of this.\n *\n * Additional projection definitions can be registered with `proj4.defs()` any\n * time. Just make sure to call `register(proj4)` again; for example, with user-supplied data where you don't\n * know in advance what projections are needed, you can initially load minimal\n * support and then load whichever are requested.\n *\n * Note that Proj4js does not support projection extents. If you want to add\n * one for creating default tile grids, you can add it after the Projection\n * object has been created with `setExtent`, for example,\n * `get('EPSG:1234').setExtent(extent)`.\n *\n * In addition to Proj4js support, any transform functions can be added with\n * {@link module:ol/proj.addCoordinateTransforms}. To use this, you must first create\n * a {@link module:ol/proj/Projection~Projection} object for the new projection and add it with\n * {@link module:ol/proj.addProjection}. You can then add the forward and inverse\n * functions with {@link module:ol/proj.addCoordinateTransforms}. See\n * examples/wms-custom-proj for an example of this.\n *\n * Note that if no transforms are needed and you only need to define the\n * projection, just add a {@link module:ol/proj/Projection~Projection} with\n * {@link module:ol/proj.addProjection}. See examples/wms-no-proj for an example of\n * this.\n */\nimport {warn} from './console.js';\nimport {equals, getWorldsAway} from './coordinate.js';\nimport {applyTransform, getWidth} from './extent.js';\nimport {clamp, modulo} from './math.js';\nimport Projection from './proj/Projection.js';\nimport {METERS_PER_UNIT} from './proj/Units.js';\nimport {\n PROJECTIONS as EPSG3857_PROJECTIONS,\n fromEPSG4326,\n toEPSG4326,\n} from './proj/epsg3857.js';\nimport {PROJECTIONS as EPSG4326_PROJECTIONS} from './proj/epsg4326.js';\nimport {\n add as addProj,\n clear as clearProj,\n get as getProj,\n} from './proj/projections.js';\nimport {\n add as addTransformFunc,\n clear as clearTransformFuncs,\n get as getTransformFunc,\n} from './proj/transforms.js';\nimport {\n makeProjection as makeUTMProjection,\n makeTransforms as makeUTMTransforms,\n} from './proj/utm.js';\nimport {getDistance} from './sphere.js';\n\n/**\n * A projection as {@link module:ol/proj/Projection~Projection}, SRS identifier\n * string or undefined.\n * @typedef {Projection|string|undefined} ProjectionLike\n * @api\n */\n\n/**\n * @typedef {Object} Transforms\n * @property {TransformFunction} forward The forward transform (from geographic).\n * @property {TransformFunction} inverse The inverse transform (to geographic).\n */\n\n/**\n * @type {Array}\n */\nconst transformFactories = [makeUTMTransforms];\n\n/**\n * @type {Array}\n */\nconst projectionFactories = [makeUTMProjection];\n\n/**\n * A transform function accepts an array of input coordinate values, an optional\n * output array, and an optional dimension (default should be 2). The function\n * transforms the input coordinate values, populates the output array, and\n * returns the output array.\n *\n * @callback TransformFunction\n * @param {Array} input\n * @param {Array} [output]\n * @param {number} [dimension]\n * @param {number} [stride]\n * @return {Array}\n *\n * @api\n */\n\nexport {METERS_PER_UNIT};\n\nexport {Projection};\n\nlet showCoordinateWarning = true;\n\n/**\n * @param {boolean} [disable] Disable console info about `useGeographic()`\n */\nexport function disableCoordinateWarning(disable) {\n const hide = disable === undefined ? true : disable;\n showCoordinateWarning = !hide;\n}\n\n/**\n * @param {Array} input Input coordinate array.\n * @param {Array} [output] Output array of coordinate values.\n * @return {Array} Output coordinate array (new array, same coordinate\n * values).\n */\nexport function cloneTransform(input, output) {\n if (output !== undefined) {\n for (let i = 0, ii = input.length; i < ii; ++i) {\n output[i] = input[i];\n }\n output = output;\n } else {\n output = input.slice();\n }\n return output;\n}\n\n/**\n * @param {Array} input Input coordinate array.\n * @param {Array} [output] Output array of coordinate values.\n * @return {Array} Input coordinate array (same array as input).\n */\nexport function identityTransform(input, output) {\n if (output !== undefined && input !== output) {\n for (let i = 0, ii = input.length; i < ii; ++i) {\n output[i] = input[i];\n }\n input = output;\n }\n return input;\n}\n\n/**\n * Add a Projection object to the list of supported projections that can be\n * looked up by their code.\n *\n * @param {Projection} projection Projection instance.\n * @api\n */\nexport function addProjection(projection) {\n addProj(projection.getCode(), projection);\n addTransformFunc(projection, projection, cloneTransform);\n}\n\n/**\n * @param {Array} projections Projections.\n */\nexport function addProjections(projections) {\n projections.forEach(addProjection);\n}\n\n/**\n * Fetches a Projection object for the code specified.\n *\n * @param {ProjectionLike} projectionLike Either a code string which is\n * a combination of authority and identifier such as \"EPSG:4326\", or an\n * existing projection object, or undefined.\n * @return {Projection|null} Projection object, or null if not in list.\n * @api\n */\nexport function get(projectionLike) {\n if (!(typeof projectionLike === 'string')) {\n return projectionLike;\n }\n const projection = getProj(projectionLike);\n if (projection) {\n return projection;\n }\n for (const makeProjection of projectionFactories) {\n const projection = makeProjection(projectionLike);\n if (projection) {\n return projection;\n }\n }\n return null;\n}\n\n/**\n * Get the resolution of the point in degrees or distance units.\n * For projections with degrees as the unit this will simply return the\n * provided resolution. For other projections the point resolution is\n * by default estimated by transforming the `point` pixel to EPSG:4326,\n * measuring its width and height on the normal sphere,\n * and taking the average of the width and height.\n * A custom function can be provided for a specific projection, either\n * by setting the `getPointResolution` option in the\n * {@link module:ol/proj/Projection~Projection} constructor or by using\n * {@link module:ol/proj/Projection~Projection#setGetPointResolution} to change an existing\n * projection object.\n * @param {ProjectionLike} projection The projection.\n * @param {number} resolution Nominal resolution in projection units.\n * @param {import(\"./coordinate.js\").Coordinate} point Point to find adjusted resolution at.\n * @param {import(\"./proj/Units.js\").Units} [units] Units to get the point resolution in.\n * Default is the projection's units.\n * @return {number} Point resolution.\n * @api\n */\nexport function getPointResolution(projection, resolution, point, units) {\n projection = get(projection);\n let pointResolution;\n const getter = projection.getPointResolutionFunc();\n if (getter) {\n pointResolution = getter(resolution, point);\n if (units && units !== projection.getUnits()) {\n const metersPerUnit = projection.getMetersPerUnit();\n if (metersPerUnit) {\n pointResolution =\n (pointResolution * metersPerUnit) / METERS_PER_UNIT[units];\n }\n }\n } else {\n const projUnits = projection.getUnits();\n if ((projUnits == 'degrees' && !units) || units == 'degrees') {\n pointResolution = resolution;\n } else {\n // Estimate point resolution by transforming the center pixel to EPSG:4326,\n // measuring its width and height on the normal sphere, and taking the\n // average of the width and height.\n const toEPSG4326 = getTransformFromProjections(\n projection,\n get('EPSG:4326'),\n );\n if (!toEPSG4326 && projUnits !== 'degrees') {\n // no transform is available\n pointResolution = resolution * projection.getMetersPerUnit();\n } else {\n let vertices = [\n point[0] - resolution / 2,\n point[1],\n point[0] + resolution / 2,\n point[1],\n point[0],\n point[1] - resolution / 2,\n point[0],\n point[1] + resolution / 2,\n ];\n vertices = toEPSG4326(vertices, vertices, 2);\n const width = getDistance(vertices.slice(0, 2), vertices.slice(2, 4));\n const height = getDistance(vertices.slice(4, 6), vertices.slice(6, 8));\n pointResolution = (width + height) / 2;\n }\n const metersPerUnit = units\n ? METERS_PER_UNIT[units]\n : projection.getMetersPerUnit();\n if (metersPerUnit !== undefined) {\n pointResolution /= metersPerUnit;\n }\n }\n }\n return pointResolution;\n}\n\n/**\n * Registers transformation functions that don't alter coordinates. Those allow\n * to transform between projections with equal meaning.\n *\n * @param {Array} projections Projections.\n * @api\n */\nexport function addEquivalentProjections(projections) {\n addProjections(projections);\n projections.forEach(function (source) {\n projections.forEach(function (destination) {\n if (source !== destination) {\n addTransformFunc(source, destination, cloneTransform);\n }\n });\n });\n}\n\n/**\n * Registers transformation functions to convert coordinates in any projection\n * in projection1 to any projection in projection2.\n *\n * @param {Array} projections1 Projections with equal\n * meaning.\n * @param {Array} projections2 Projections with equal\n * meaning.\n * @param {TransformFunction} forwardTransform Transformation from any\n * projection in projection1 to any projection in projection2.\n * @param {TransformFunction} inverseTransform Transform from any projection\n * in projection2 to any projection in projection1..\n */\nexport function addEquivalentTransforms(\n projections1,\n projections2,\n forwardTransform,\n inverseTransform,\n) {\n projections1.forEach(function (projection1) {\n projections2.forEach(function (projection2) {\n addTransformFunc(projection1, projection2, forwardTransform);\n addTransformFunc(projection2, projection1, inverseTransform);\n });\n });\n}\n\n/**\n * Clear all cached projections and transforms.\n */\nexport function clearAllProjections() {\n clearProj();\n clearTransformFuncs();\n}\n\n/**\n * @param {Projection|string|undefined} projection Projection.\n * @param {string} defaultCode Default code.\n * @return {Projection} Projection.\n */\nexport function createProjection(projection, defaultCode) {\n if (!projection) {\n return get(defaultCode);\n }\n if (typeof projection === 'string') {\n return get(projection);\n }\n return /** @type {Projection} */ (projection);\n}\n\n/**\n * Creates a {@link module:ol/proj~TransformFunction} from a simple 2D coordinate transform\n * function.\n * @param {function(import(\"./coordinate.js\").Coordinate): import(\"./coordinate.js\").Coordinate} coordTransform Coordinate\n * transform.\n * @return {TransformFunction} Transform function.\n */\nexport function createTransformFromCoordinateTransform(coordTransform) {\n return (\n /**\n * @param {Array} input Input.\n * @param {Array} [output] Output.\n * @param {number} [dimension] Dimensions that should be transformed.\n * @param {number} [stride] Stride.\n * @return {Array} Output.\n */\n function (input, output, dimension, stride) {\n const length = input.length;\n dimension = dimension !== undefined ? dimension : 2;\n stride = stride ?? dimension;\n output = output !== undefined ? output : new Array(length);\n for (let i = 0; i < length; i += stride) {\n const point = coordTransform(input.slice(i, i + dimension));\n const pointLength = point.length;\n for (let j = 0, jj = stride; j < jj; ++j) {\n output[i + j] = j >= pointLength ? input[i + j] : point[j];\n }\n }\n return output;\n }\n );\n}\n\n/**\n * Registers coordinate transform functions to convert coordinates between the\n * source projection and the destination projection.\n * The forward and inverse functions convert coordinate pairs; this function\n * converts these into the functions used internally which also handle\n * extents and coordinate arrays.\n *\n * @param {ProjectionLike} source Source projection.\n * @param {ProjectionLike} destination Destination projection.\n * @param {function(import(\"./coordinate.js\").Coordinate): import(\"./coordinate.js\").Coordinate} forward The forward transform\n * function (that is, from the source projection to the destination\n * projection) that takes a {@link module:ol/coordinate~Coordinate} as argument and returns\n * the transformed {@link module:ol/coordinate~Coordinate}.\n * @param {function(import(\"./coordinate.js\").Coordinate): import(\"./coordinate.js\").Coordinate} inverse The inverse transform\n * function (that is, from the destination projection to the source\n * projection) that takes a {@link module:ol/coordinate~Coordinate} as argument and returns\n * the transformed {@link module:ol/coordinate~Coordinate}. If the transform function can only\n * transform less dimensions than the input coordinate, it is supposeed to return a coordinate\n * with only the length it can transform. The other dimensions will be taken unchanged from the\n * source.\n * @api\n */\nexport function addCoordinateTransforms(source, destination, forward, inverse) {\n const sourceProj = get(source);\n const destProj = get(destination);\n addTransformFunc(\n sourceProj,\n destProj,\n createTransformFromCoordinateTransform(forward),\n );\n addTransformFunc(\n destProj,\n sourceProj,\n createTransformFromCoordinateTransform(inverse),\n );\n}\n\n/**\n * Transforms a coordinate from longitude/latitude to a different projection.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate as longitude and latitude, i.e.\n * an array with longitude as 1st and latitude as 2nd element.\n * @param {ProjectionLike} [projection] Target projection. The\n * default is Web Mercator, i.e. 'EPSG:3857'.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate projected to the target projection.\n * @api\n */\nexport function fromLonLat(coordinate, projection) {\n disableCoordinateWarning();\n return transform(\n coordinate,\n 'EPSG:4326',\n projection !== undefined ? projection : 'EPSG:3857',\n );\n}\n\n/**\n * Transforms a coordinate to longitude/latitude.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Projected coordinate.\n * @param {ProjectionLike} [projection] Projection of the coordinate.\n * The default is Web Mercator, i.e. 'EPSG:3857'.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate as longitude and latitude, i.e. an array\n * with longitude as 1st and latitude as 2nd element.\n * @api\n */\nexport function toLonLat(coordinate, projection) {\n const lonLat = transform(\n coordinate,\n projection !== undefined ? projection : 'EPSG:3857',\n 'EPSG:4326',\n );\n const lon = lonLat[0];\n if (lon < -180 || lon > 180) {\n lonLat[0] = modulo(lon + 180, 360) - 180;\n }\n return lonLat;\n}\n\n/**\n * Checks if two projections are the same, that is every coordinate in one\n * projection does represent the same geographic point as the same coordinate in\n * the other projection.\n *\n * @param {Projection} projection1 Projection 1.\n * @param {Projection} projection2 Projection 2.\n * @return {boolean} Equivalent.\n * @api\n */\nexport function equivalent(projection1, projection2) {\n if (projection1 === projection2) {\n return true;\n }\n const equalUnits = projection1.getUnits() === projection2.getUnits();\n if (projection1.getCode() === projection2.getCode()) {\n return equalUnits;\n }\n const transformFunc = getTransformFromProjections(projection1, projection2);\n return transformFunc === cloneTransform && equalUnits;\n}\n\n/**\n * Searches in the list of transform functions for the function for converting\n * coordinates from the source projection to the destination projection.\n *\n * @param {Projection} source Source Projection object.\n * @param {Projection} destination Destination Projection\n * object.\n * @return {TransformFunction|null} Transform function.\n */\nexport function getTransformFromProjections(source, destination) {\n const sourceCode = source.getCode();\n const destinationCode = destination.getCode();\n let transformFunc = getTransformFunc(sourceCode, destinationCode);\n if (transformFunc) {\n return transformFunc;\n }\n\n /**\n * @type {Transforms|null}\n */\n let sourceTransforms = null;\n\n /**\n * @type {Transforms|null}\n */\n let destinationTransforms = null;\n\n // lazily add projections if we have supported transforms\n for (const makeTransforms of transformFactories) {\n if (!sourceTransforms) {\n sourceTransforms = makeTransforms(source);\n }\n if (!destinationTransforms) {\n destinationTransforms = makeTransforms(destination);\n }\n }\n\n if (!sourceTransforms && !destinationTransforms) {\n return null;\n }\n\n const intermediateCode = 'EPSG:4326';\n if (!destinationTransforms) {\n const toDestination = getTransformFunc(intermediateCode, destinationCode);\n if (toDestination) {\n transformFunc = composeTransformFuncs(\n sourceTransforms.inverse,\n toDestination,\n );\n }\n } else if (!sourceTransforms) {\n const fromSource = getTransformFunc(sourceCode, intermediateCode);\n if (fromSource) {\n transformFunc = composeTransformFuncs(\n fromSource,\n destinationTransforms.forward,\n );\n }\n } else {\n transformFunc = composeTransformFuncs(\n sourceTransforms.inverse,\n destinationTransforms.forward,\n );\n }\n\n if (transformFunc) {\n addProjection(source);\n addProjection(destination);\n addTransformFunc(source, destination, transformFunc);\n }\n\n return transformFunc;\n}\n\n/**\n * @param {TransformFunction} t1 The first transform function.\n * @param {TransformFunction} t2 The second transform function.\n * @return {TransformFunction} The composed transform function.\n */\nfunction composeTransformFuncs(t1, t2) {\n return function (input, output, dimensions, stride) {\n output = t1(input, output, dimensions, stride);\n return t2(output, output, dimensions, stride);\n };\n}\n\n/**\n * Given the projection-like objects, searches for a transformation\n * function to convert a coordinates array from the source projection to the\n * destination projection.\n *\n * @param {ProjectionLike} source Source.\n * @param {ProjectionLike} destination Destination.\n * @return {TransformFunction} Transform function.\n * @api\n */\nexport function getTransform(source, destination) {\n const sourceProjection = get(source);\n const destinationProjection = get(destination);\n return getTransformFromProjections(sourceProjection, destinationProjection);\n}\n\n/**\n * Transforms a coordinate from source projection to destination projection.\n * This returns a new coordinate (and does not modify the original). If there\n * is no available transform between the two projection, the function will throw\n * an error.\n *\n * See {@link module:ol/proj.transformExtent} for extent transformation.\n * See the transform method of {@link module:ol/geom/Geometry~Geometry} and its\n * subclasses for geometry transforms.\n *\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {ProjectionLike} source Source projection-like.\n * @param {ProjectionLike} destination Destination projection-like.\n * @return {import(\"./coordinate.js\").Coordinate} Coordinate.\n * @api\n */\nexport function transform(coordinate, source, destination) {\n const transformFunc = getTransform(source, destination);\n if (!transformFunc) {\n const sourceCode = get(source).getCode();\n const destinationCode = get(destination).getCode();\n throw new Error(\n `No transform available between ${sourceCode} and ${destinationCode}`,\n );\n }\n return transformFunc(coordinate, undefined, coordinate.length);\n}\n\n/**\n * Transforms an extent from source projection to destination projection. This\n * returns a new extent (and does not modify the original).\n *\n * @param {import(\"./extent.js\").Extent} extent The extent to transform.\n * @param {ProjectionLike} source Source projection-like.\n * @param {ProjectionLike} destination Destination projection-like.\n * @param {number} [stops] Number of stops per side used for the transform.\n * By default only the corners are used.\n * @return {import(\"./extent.js\").Extent} The transformed extent.\n * @api\n */\nexport function transformExtent(extent, source, destination, stops) {\n const transformFunc = getTransform(source, destination);\n return applyTransform(extent, transformFunc, undefined, stops);\n}\n\n/**\n * Transforms the given point to the destination projection.\n *\n * @param {import(\"./coordinate.js\").Coordinate} point Point.\n * @param {Projection} sourceProjection Source projection.\n * @param {Projection} destinationProjection Destination projection.\n * @return {import(\"./coordinate.js\").Coordinate} Point.\n */\nexport function transformWithProjections(\n point,\n sourceProjection,\n destinationProjection,\n) {\n const transformFunc = getTransformFromProjections(\n sourceProjection,\n destinationProjection,\n );\n return transformFunc(point);\n}\n\n/**\n * @type {Projection|null}\n */\nlet userProjection = null;\n\n/**\n * Set the projection for coordinates supplied from and returned by API methods.\n * This includes all API methods except for those interacting with tile grids,\n * plus {@link import(\"./Map.js\").FrameState} and {@link import(\"./View.js\").State}.\n * @param {ProjectionLike} projection The user projection.\n * @api\n */\nexport function setUserProjection(projection) {\n userProjection = get(projection);\n}\n\n/**\n * Clear the user projection if set.\n * @api\n */\nexport function clearUserProjection() {\n userProjection = null;\n}\n\n/**\n * Get the projection for coordinates supplied from and returned by API methods.\n * @return {Projection|null} The user projection (or null if not set).\n * @api\n */\nexport function getUserProjection() {\n return userProjection;\n}\n\n/**\n * Use geographic coordinates (WGS-84 datum) in API methods.\n * This includes all API methods except for those interacting with tile grids,\n * plus {@link import(\"./Map.js\").FrameState} and {@link import(\"./View.js\").State}.\n * @api\n */\nexport function useGeographic() {\n setUserProjection('EPSG:4326');\n}\n\n/**\n * Return a coordinate transformed into the user projection. If no user projection\n * is set, the original coordinate is returned.\n * @param {Array} coordinate Input coordinate.\n * @param {ProjectionLike} sourceProjection The input coordinate projection.\n * @return {Array} The input coordinate in the user projection.\n */\nexport function toUserCoordinate(coordinate, sourceProjection) {\n if (!userProjection) {\n return coordinate;\n }\n return transform(coordinate, sourceProjection, userProjection);\n}\n\n/**\n * Return a coordinate transformed from the user projection. If no user projection\n * is set, the original coordinate is returned.\n * @param {Array} coordinate Input coordinate.\n * @param {ProjectionLike} destProjection The destination projection.\n * @return {Array} The input coordinate transformed.\n */\nexport function fromUserCoordinate(coordinate, destProjection) {\n if (!userProjection) {\n if (\n showCoordinateWarning &&\n !equals(coordinate, [0, 0]) &&\n coordinate[0] >= -180 &&\n coordinate[0] <= 180 &&\n coordinate[1] >= -90 &&\n coordinate[1] <= 90\n ) {\n showCoordinateWarning = false;\n warn(\n 'Call useGeographic() from ol/proj once to work with [longitude, latitude] coordinates.',\n );\n }\n return coordinate;\n }\n return transform(coordinate, userProjection, destProjection);\n}\n\n/**\n * Return an extent transformed into the user projection. If no user projection\n * is set, the original extent is returned.\n * @param {import(\"./extent.js\").Extent} extent Input extent.\n * @param {ProjectionLike} sourceProjection The input extent projection.\n * @return {import(\"./extent.js\").Extent} The input extent in the user projection.\n */\nexport function toUserExtent(extent, sourceProjection) {\n if (!userProjection) {\n return extent;\n }\n return transformExtent(extent, sourceProjection, userProjection);\n}\n\n/**\n * Return an extent transformed from the user projection. If no user projection\n * is set, the original extent is returned.\n * @param {import(\"./extent.js\").Extent} extent Input extent.\n * @param {ProjectionLike} destProjection The destination projection.\n * @return {import(\"./extent.js\").Extent} The input extent transformed.\n */\nexport function fromUserExtent(extent, destProjection) {\n if (!userProjection) {\n return extent;\n }\n return transformExtent(extent, userProjection, destProjection);\n}\n\n/**\n * Return the resolution in user projection units per pixel. If no user projection\n * is set, or source or user projection are missing units, the original resolution\n * is returned.\n * @param {number} resolution Resolution in input projection units per pixel.\n * @param {ProjectionLike} sourceProjection The input projection.\n * @return {number} Resolution in user projection units per pixel.\n */\nexport function toUserResolution(resolution, sourceProjection) {\n if (!userProjection) {\n return resolution;\n }\n const sourceMetersPerUnit = get(sourceProjection).getMetersPerUnit();\n const userMetersPerUnit = userProjection.getMetersPerUnit();\n return sourceMetersPerUnit && userMetersPerUnit\n ? (resolution * sourceMetersPerUnit) / userMetersPerUnit\n : resolution;\n}\n\n/**\n * Return the resolution in user projection units per pixel. If no user projection\n * is set, or source or user projection are missing units, the original resolution\n * is returned.\n * @param {number} resolution Resolution in user projection units per pixel.\n * @param {ProjectionLike} destProjection The destination projection.\n * @return {number} Resolution in destination projection units per pixel.\n */\nexport function fromUserResolution(resolution, destProjection) {\n if (!userProjection) {\n return resolution;\n }\n const destMetersPerUnit = get(destProjection).getMetersPerUnit();\n const userMetersPerUnit = userProjection.getMetersPerUnit();\n return destMetersPerUnit && userMetersPerUnit\n ? (resolution * userMetersPerUnit) / destMetersPerUnit\n : resolution;\n}\n\n/**\n * Creates a safe coordinate transform function from a coordinate transform function.\n * \"Safe\" means that it can handle wrapping of x-coordinates for global projections,\n * and that coordinates exceeding the source projection validity extent's range will be\n * clamped to the validity range.\n * @param {Projection} sourceProj Source projection.\n * @param {Projection} destProj Destination projection.\n * @param {function(import(\"./coordinate.js\").Coordinate): import(\"./coordinate.js\").Coordinate} transform Transform function (source to destination).\n * @return {function(import(\"./coordinate.js\").Coordinate): import(\"./coordinate.js\").Coordinate} Safe transform function (source to destination).\n */\nexport function createSafeCoordinateTransform(sourceProj, destProj, transform) {\n return function (coord) {\n let transformed, worldsAway;\n if (sourceProj.canWrapX()) {\n const sourceExtent = sourceProj.getExtent();\n const sourceExtentWidth = getWidth(sourceExtent);\n coord = coord.slice(0);\n worldsAway = getWorldsAway(coord, sourceProj, sourceExtentWidth);\n if (worldsAway) {\n // Move x to the real world\n coord[0] = coord[0] - worldsAway * sourceExtentWidth;\n }\n coord[0] = clamp(coord[0], sourceExtent[0], sourceExtent[2]);\n coord[1] = clamp(coord[1], sourceExtent[1], sourceExtent[3]);\n transformed = transform(coord);\n } else {\n transformed = transform(coord);\n }\n if (worldsAway && destProj.canWrapX()) {\n // Move transformed coordinate back to the offset world\n transformed[0] += worldsAway * getWidth(destProj.getExtent());\n }\n return transformed;\n };\n}\n\n/**\n * Add transforms to and from EPSG:4326 and EPSG:3857. This function is called\n * by when this module is executed and should only need to be called again after\n * `clearAllProjections()` is called (e.g. in tests).\n */\nexport function addCommon() {\n // Add transformations that don't alter coordinates to convert within set of\n // projections with equal meaning.\n addEquivalentProjections(EPSG3857_PROJECTIONS);\n addEquivalentProjections(EPSG4326_PROJECTIONS);\n // Add transformations to convert EPSG:4326 like coordinates to EPSG:3857 like\n // coordinates and back.\n addEquivalentTransforms(\n EPSG4326_PROJECTIONS,\n EPSG3857_PROJECTIONS,\n fromEPSG4326,\n toEPSG4326,\n );\n}\n\naddCommon();\n","/**\n * @module ol/transform\n */\nimport {assert} from './asserts.js';\n\n/**\n * An array representing an affine 2d transformation for use with\n * {@link module:ol/transform} functions. The array has 6 elements.\n * @typedef {!Array} Transform\n * @api\n */\n\n/**\n * Collection of affine 2d transformation functions. The functions work on an\n * array of 6 elements. The element order is compatible with the [SVGMatrix\n * interface](https://developer.mozilla.org/en-US/docs/Web/API/SVGMatrix) and is\n * a subset (elements a to f) of a 3×3 matrix:\n * ```\n * [ a c e ]\n * [ b d f ]\n * [ 0 0 1 ]\n * ```\n */\n\n/** @type {Transform} */\nexport const IDENTITY_TRANSFORM = [1, 0, 0, 1, 0, 0];\n\n/**\n * @private\n * @type {Transform}\n */\nconst tmp_ = new Array(6);\n\n/**\n * Create an identity transform.\n * @return {!Transform} Identity transform.\n */\nexport function create() {\n return IDENTITY_TRANSFORM.slice(0);\n}\n\n/**\n * Resets the given transform to an identity transform.\n * @param {!Transform} transform Transform.\n * @return {!Transform} Transform.\n */\nexport function reset(transform) {\n return set(transform, 1, 0, 0, 1, 0, 0);\n}\n\n/**\n * Multiply the underlying matrices of two transforms and return the result in\n * the first transform.\n * @param {!Transform} transform1 Transform parameters of matrix 1.\n * @param {!Transform} transform2 Transform parameters of matrix 2.\n * @return {!Transform} transform1 multiplied with transform2.\n */\nexport function multiply(transform1, transform2) {\n const a1 = transform1[0];\n const b1 = transform1[1];\n const c1 = transform1[2];\n const d1 = transform1[3];\n const e1 = transform1[4];\n const f1 = transform1[5];\n const a2 = transform2[0];\n const b2 = transform2[1];\n const c2 = transform2[2];\n const d2 = transform2[3];\n const e2 = transform2[4];\n const f2 = transform2[5];\n\n transform1[0] = a1 * a2 + c1 * b2;\n transform1[1] = b1 * a2 + d1 * b2;\n transform1[2] = a1 * c2 + c1 * d2;\n transform1[3] = b1 * c2 + d1 * d2;\n transform1[4] = a1 * e2 + c1 * f2 + e1;\n transform1[5] = b1 * e2 + d1 * f2 + f1;\n\n return transform1;\n}\n\n/**\n * Set the transform components a-f on a given transform.\n * @param {!Transform} transform Transform.\n * @param {number} a The a component of the transform.\n * @param {number} b The b component of the transform.\n * @param {number} c The c component of the transform.\n * @param {number} d The d component of the transform.\n * @param {number} e The e component of the transform.\n * @param {number} f The f component of the transform.\n * @return {!Transform} Matrix with transform applied.\n */\nexport function set(transform, a, b, c, d, e, f) {\n transform[0] = a;\n transform[1] = b;\n transform[2] = c;\n transform[3] = d;\n transform[4] = e;\n transform[5] = f;\n return transform;\n}\n\n/**\n * Set transform on one matrix from another matrix.\n * @param {!Transform} transform1 Matrix to set transform to.\n * @param {!Transform} transform2 Matrix to set transform from.\n * @return {!Transform} transform1 with transform from transform2 applied.\n */\nexport function setFromArray(transform1, transform2) {\n transform1[0] = transform2[0];\n transform1[1] = transform2[1];\n transform1[2] = transform2[2];\n transform1[3] = transform2[3];\n transform1[4] = transform2[4];\n transform1[5] = transform2[5];\n return transform1;\n}\n\n/**\n * Transforms the given coordinate with the given transform returning the\n * resulting, transformed coordinate. The coordinate will be modified in-place.\n *\n * @param {Transform} transform The transformation.\n * @param {import(\"./coordinate.js\").Coordinate|import(\"./pixel.js\").Pixel} coordinate The coordinate to transform.\n * @return {import(\"./coordinate.js\").Coordinate|import(\"./pixel.js\").Pixel} return coordinate so that operations can be\n * chained together.\n */\nexport function apply(transform, coordinate) {\n const x = coordinate[0];\n const y = coordinate[1];\n coordinate[0] = transform[0] * x + transform[2] * y + transform[4];\n coordinate[1] = transform[1] * x + transform[3] * y + transform[5];\n return coordinate;\n}\n\n/**\n * Applies rotation to the given transform.\n * @param {!Transform} transform Transform.\n * @param {number} angle Angle in radians.\n * @return {!Transform} The rotated transform.\n */\nexport function rotate(transform, angle) {\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n return multiply(transform, set(tmp_, cos, sin, -sin, cos, 0, 0));\n}\n\n/**\n * Applies scale to a given transform.\n * @param {!Transform} transform Transform.\n * @param {number} x Scale factor x.\n * @param {number} y Scale factor y.\n * @return {!Transform} The scaled transform.\n */\nexport function scale(transform, x, y) {\n return multiply(transform, set(tmp_, x, 0, 0, y, 0, 0));\n}\n\n/**\n * Creates a scale transform.\n * @param {!Transform} target Transform to overwrite.\n * @param {number} x Scale factor x.\n * @param {number} y Scale factor y.\n * @return {!Transform} The scale transform.\n */\nexport function makeScale(target, x, y) {\n return set(target, x, 0, 0, y, 0, 0);\n}\n\n/**\n * Applies translation to the given transform.\n * @param {!Transform} transform Transform.\n * @param {number} dx Translation x.\n * @param {number} dy Translation y.\n * @return {!Transform} The translated transform.\n */\nexport function translate(transform, dx, dy) {\n return multiply(transform, set(tmp_, 1, 0, 0, 1, dx, dy));\n}\n\n/**\n * Creates a composite transform given an initial translation, scale, rotation, and\n * final translation (in that order only, not commutative).\n * @param {!Transform} transform The transform (will be modified in place).\n * @param {number} dx1 Initial translation x.\n * @param {number} dy1 Initial translation y.\n * @param {number} sx Scale factor x.\n * @param {number} sy Scale factor y.\n * @param {number} angle Rotation (in counter-clockwise radians).\n * @param {number} dx2 Final translation x.\n * @param {number} dy2 Final translation y.\n * @return {!Transform} The composite transform.\n */\nexport function compose(transform, dx1, dy1, sx, sy, angle, dx2, dy2) {\n const sin = Math.sin(angle);\n const cos = Math.cos(angle);\n transform[0] = sx * cos;\n transform[1] = sy * sin;\n transform[2] = -sx * sin;\n transform[3] = sy * cos;\n transform[4] = dx2 * sx * cos - dy2 * sx * sin + dx1;\n transform[5] = dx2 * sy * sin + dy2 * sy * cos + dy1;\n return transform;\n}\n\n/**\n * Creates a composite transform given an initial translation, scale, rotation, and\n * final translation (in that order only, not commutative). The resulting transform\n * string can be applied as `transform` property of an HTMLElement's style.\n * @param {number} dx1 Initial translation x.\n * @param {number} dy1 Initial translation y.\n * @param {number} sx Scale factor x.\n * @param {number} sy Scale factor y.\n * @param {number} angle Rotation (in counter-clockwise radians).\n * @param {number} dx2 Final translation x.\n * @param {number} dy2 Final translation y.\n * @return {string} The composite css transform.\n * @api\n */\nexport function composeCssTransform(dx1, dy1, sx, sy, angle, dx2, dy2) {\n return toString(compose(create(), dx1, dy1, sx, sy, angle, dx2, dy2));\n}\n\n/**\n * Invert the given transform.\n * @param {!Transform} source The source transform to invert.\n * @return {!Transform} The inverted (source) transform.\n */\nexport function invert(source) {\n return makeInverse(source, source);\n}\n\n/**\n * Invert the given transform.\n * @param {!Transform} target Transform to be set as the inverse of\n * the source transform.\n * @param {!Transform} source The source transform to invert.\n * @return {!Transform} The inverted (target) transform.\n */\nexport function makeInverse(target, source) {\n const det = determinant(source);\n assert(det !== 0, 'Transformation matrix cannot be inverted');\n\n const a = source[0];\n const b = source[1];\n const c = source[2];\n const d = source[3];\n const e = source[4];\n const f = source[5];\n\n target[0] = d / det;\n target[1] = -b / det;\n target[2] = -c / det;\n target[3] = a / det;\n target[4] = (c * f - d * e) / det;\n target[5] = -(a * f - b * e) / det;\n\n return target;\n}\n\n/**\n * Returns the determinant of the given matrix.\n * @param {!Transform} mat Matrix.\n * @return {number} Determinant.\n */\nexport function determinant(mat) {\n return mat[0] * mat[3] - mat[1] * mat[2];\n}\n\n/**\n * @type {Array}\n */\nconst matrixPrecision = [1e5, 1e5, 1e5, 1e5, 2, 2];\n\n/**\n * A matrix string version of the transform. This can be used\n * for CSS transforms.\n * @param {!Transform} mat Matrix.\n * @return {string} The transform as a string.\n */\nexport function toString(mat) {\n const transformString = 'matrix(' + mat.join(', ') + ')';\n return transformString;\n}\n\n/**\n * Create a transform from a CSS transform matrix string.\n * @param {string} cssTransform The CSS string to parse.\n * @return {!Transform} The transform.\n */\nexport function fromString(cssTransform) {\n const values = cssTransform.substring(7, cssTransform.length - 1).split(',');\n return values.map(parseFloat);\n}\n\n/**\n * Compare two matrices for equality.\n * @param {!string} cssTransform1 A CSS transform matrix string.\n * @param {!string} cssTransform2 A CSS transform matrix string.\n * @return {boolean} The two matrices are equal.\n */\nexport function equivalent(cssTransform1, cssTransform2) {\n const mat1 = fromString(cssTransform1);\n const mat2 = fromString(cssTransform2);\n for (let i = 0; i < 6; ++i) {\n if (Math.round((mat1[i] - mat2[i]) * matrixPrecision[i]) !== 0) {\n return false;\n }\n }\n return true;\n}\n","/**\n * @module ol/geom/flat/transform\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import(\"../../transform.js\").Transform} transform Transform.\n * @param {Array} [dest] Destination.\n * @param {number} [destinationStride] Stride of destination coordinates; if unspecified, assumed to be 2.\n * @return {Array} Transformed coordinates.\n */\nexport function transform2D(\n flatCoordinates,\n offset,\n end,\n stride,\n transform,\n dest,\n destinationStride,\n) {\n dest = dest ? dest : [];\n destinationStride = destinationStride ? destinationStride : 2;\n let i = 0;\n for (let j = offset; j < end; j += stride) {\n const x = flatCoordinates[j];\n const y = flatCoordinates[j + 1];\n dest[i++] = transform[0] * x + transform[2] * y + transform[4];\n dest[i++] = transform[1] * x + transform[3] * y + transform[5];\n\n for (let k = 2; k < destinationStride; k++) {\n dest[i++] = flatCoordinates[j + k];\n }\n }\n\n if (dest && dest.length != i) {\n dest.length = i;\n }\n return dest;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} angle Angle.\n * @param {Array} anchor Rotation anchor point.\n * @param {Array} [dest] Destination.\n * @return {Array} Transformed coordinates.\n */\nexport function rotate(\n flatCoordinates,\n offset,\n end,\n stride,\n angle,\n anchor,\n dest,\n) {\n dest = dest ? dest : [];\n const cos = Math.cos(angle);\n const sin = Math.sin(angle);\n const anchorX = anchor[0];\n const anchorY = anchor[1];\n let i = 0;\n for (let j = offset; j < end; j += stride) {\n const deltaX = flatCoordinates[j] - anchorX;\n const deltaY = flatCoordinates[j + 1] - anchorY;\n dest[i++] = anchorX + deltaX * cos - deltaY * sin;\n dest[i++] = anchorY + deltaX * sin + deltaY * cos;\n for (let k = j + 2; k < j + stride; ++k) {\n dest[i++] = flatCoordinates[k];\n }\n }\n if (dest && dest.length != i) {\n dest.length = i;\n }\n return dest;\n}\n\n/**\n * Scale the coordinates.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} sx Scale factor in the x-direction.\n * @param {number} sy Scale factor in the y-direction.\n * @param {Array} anchor Scale anchor point.\n * @param {Array} [dest] Destination.\n * @return {Array} Transformed coordinates.\n */\nexport function scale(\n flatCoordinates,\n offset,\n end,\n stride,\n sx,\n sy,\n anchor,\n dest,\n) {\n dest = dest ? dest : [];\n const anchorX = anchor[0];\n const anchorY = anchor[1];\n let i = 0;\n for (let j = offset; j < end; j += stride) {\n const deltaX = flatCoordinates[j] - anchorX;\n const deltaY = flatCoordinates[j + 1] - anchorY;\n dest[i++] = anchorX + sx * deltaX;\n dest[i++] = anchorY + sy * deltaY;\n for (let k = j + 2; k < j + stride; ++k) {\n dest[i++] = flatCoordinates[k];\n }\n }\n if (dest && dest.length != i) {\n dest.length = i;\n }\n return dest;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @param {Array} [dest] Destination.\n * @return {Array} Transformed coordinates.\n */\nexport function translate(\n flatCoordinates,\n offset,\n end,\n stride,\n deltaX,\n deltaY,\n dest,\n) {\n dest = dest ? dest : [];\n let i = 0;\n for (let j = offset; j < end; j += stride) {\n dest[i++] = flatCoordinates[j] + deltaX;\n dest[i++] = flatCoordinates[j + 1] + deltaY;\n for (let k = j + 2; k < j + stride; ++k) {\n dest[i++] = flatCoordinates[k];\n }\n }\n if (dest && dest.length != i) {\n dest.length = i;\n }\n return dest;\n}\n","/**\n * @module ol/geom/Geometry\n */\nimport BaseObject from '../Object.js';\nimport {\n createEmpty,\n createOrUpdateEmpty,\n getHeight,\n returnOrUpdate,\n} from '../extent.js';\nimport {memoizeOne} from '../functions.js';\nimport {get as getProjection, getTransform} from '../proj.js';\nimport {\n compose as composeTransform,\n create as createTransform,\n} from '../transform.js';\nimport {abstract} from '../util.js';\nimport {transform2D} from './flat/transform.js';\n\n/**\n * @typedef {'XY' | 'XYZ' | 'XYM' | 'XYZM'} GeometryLayout\n * The coordinate layout for geometries, indicating whether a 3rd or 4th z ('Z')\n * or measure ('M') coordinate is available.\n */\n\n/**\n * @typedef {'Point' | 'LineString' | 'LinearRing' | 'Polygon' | 'MultiPoint' | 'MultiLineString' | 'MultiPolygon' | 'GeometryCollection' | 'Circle'} Type\n * The geometry type. One of `'Point'`, `'LineString'`, `'LinearRing'`,\n * `'Polygon'`, `'MultiPoint'`, `'MultiLineString'`, `'MultiPolygon'`,\n * `'GeometryCollection'`, or `'Circle'`.\n */\n\n/**\n * @type {import(\"../transform.js\").Transform}\n */\nconst tmpTransform = createTransform();\n\n/** @type {import('../coordinate.js').Coordinate} */\nconst tmpPoint = [NaN, NaN];\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * Base class for vector geometries.\n *\n * To get notified of changes to the geometry, register a listener for the\n * generic `change` event on your geometry instance.\n *\n * @abstract\n * @api\n */\nclass Geometry extends BaseObject {\n constructor() {\n super();\n\n /**\n * @private\n * @type {import(\"../extent.js\").Extent}\n */\n this.extent_ = createEmpty();\n\n /**\n * @private\n * @type {number}\n */\n this.extentRevision_ = -1;\n\n /**\n * @protected\n * @type {number}\n */\n this.simplifiedGeometryMaxMinSquaredTolerance = 0;\n\n /**\n * @protected\n * @type {number}\n */\n this.simplifiedGeometryRevision = 0;\n\n /**\n * Get a transformed and simplified version of the geometry.\n * @abstract\n * @param {number} revision The geometry revision.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {import(\"../proj.js\").TransformFunction} [transform] Optional transform function.\n * @return {Geometry} Simplified geometry.\n */\n this.simplifyTransformedInternal = memoizeOne(\n (revision, squaredTolerance, transform) => {\n if (!transform) {\n return this.getSimplifiedGeometry(squaredTolerance);\n }\n const clone = this.clone();\n clone.applyTransform(transform);\n return clone.getSimplifiedGeometry(squaredTolerance);\n },\n );\n }\n\n /**\n * Get a transformed and simplified version of the geometry.\n * @abstract\n * @param {number} squaredTolerance Squared tolerance.\n * @param {import(\"../proj.js\").TransformFunction} [transform] Optional transform function.\n * @return {Geometry} Simplified geometry.\n */\n simplifyTransformed(squaredTolerance, transform) {\n return this.simplifyTransformedInternal(\n this.getRevision(),\n squaredTolerance,\n transform,\n );\n }\n\n /**\n * Make a complete copy of the geometry.\n * @abstract\n * @return {!Geometry} Clone.\n */\n clone() {\n return abstract();\n }\n\n /**\n * @abstract\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n */\n closestPointXY(x, y, closestPoint, minSquaredDistance) {\n return abstract();\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\n containsXY(x, y) {\n return this.closestPointXY(x, y, tmpPoint, Number.MIN_VALUE) === 0;\n }\n\n /**\n * Return the closest point of the geometry to the passed point as\n * {@link module:ol/coordinate~Coordinate coordinate}.\n * @param {import(\"../coordinate.js\").Coordinate} point Point.\n * @param {import(\"../coordinate.js\").Coordinate} [closestPoint] Closest point.\n * @return {import(\"../coordinate.js\").Coordinate} Closest point.\n * @api\n */\n getClosestPoint(point, closestPoint) {\n closestPoint = closestPoint ? closestPoint : [NaN, NaN];\n this.closestPointXY(point[0], point[1], closestPoint, Infinity);\n return closestPoint;\n }\n\n /**\n * Returns true if this geometry includes the specified coordinate. If the\n * coordinate is on the boundary of the geometry, returns false.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {boolean} Contains coordinate.\n * @api\n */\n intersectsCoordinate(coordinate) {\n return this.containsXY(coordinate[0], coordinate[1]);\n }\n\n /**\n * @abstract\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n */\n computeExtent(extent) {\n return abstract();\n }\n\n /**\n * Get the extent of the geometry.\n * @param {import(\"../extent.js\").Extent} [extent] Extent.\n * @return {import(\"../extent.js\").Extent} extent Extent.\n * @api\n */\n getExtent(extent) {\n if (this.extentRevision_ != this.getRevision()) {\n const extent = this.computeExtent(this.extent_);\n if (isNaN(extent[0]) || isNaN(extent[1])) {\n createOrUpdateEmpty(extent);\n }\n this.extentRevision_ = this.getRevision();\n }\n return returnOrUpdate(this.extent_, extent);\n }\n\n /**\n * Rotate the geometry around a given coordinate. This modifies the geometry\n * coordinates in place.\n * @abstract\n * @param {number} angle Rotation angle in radians.\n * @param {import(\"../coordinate.js\").Coordinate} anchor The rotation center.\n * @api\n */\n rotate(angle, anchor) {\n abstract();\n }\n\n /**\n * Scale the geometry (with an optional origin). This modifies the geometry\n * coordinates in place.\n * @abstract\n * @param {number} sx The scaling factor in the x-direction.\n * @param {number} [sy] The scaling factor in the y-direction (defaults to sx).\n * @param {import(\"../coordinate.js\").Coordinate} [anchor] The scale origin (defaults to the center\n * of the geometry extent).\n * @api\n */\n scale(sx, sy, anchor) {\n abstract();\n }\n\n /**\n * Create a simplified version of this geometry. For linestrings, this uses\n * the [Douglas Peucker](https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm)\n * algorithm. For polygons, a quantization-based\n * simplification is used to preserve topology.\n * @param {number} tolerance The tolerance distance for simplification.\n * @return {Geometry} A new, simplified version of the original geometry.\n * @api\n */\n simplify(tolerance) {\n return this.getSimplifiedGeometry(tolerance * tolerance);\n }\n\n /**\n * Create a simplified version of this geometry using the Douglas Peucker\n * algorithm.\n * See https://en.wikipedia.org/wiki/Ramer-Douglas-Peucker_algorithm.\n * @abstract\n * @param {number} squaredTolerance Squared tolerance.\n * @return {Geometry} Simplified geometry.\n */\n getSimplifiedGeometry(squaredTolerance) {\n return abstract();\n }\n\n /**\n * Get the type of this geometry.\n * @abstract\n * @return {Type} Geometry type.\n */\n getType() {\n return abstract();\n }\n\n /**\n * Apply a transform function to the coordinates of the geometry.\n * The geometry is modified in place.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n * @abstract\n * @param {import(\"../proj.js\").TransformFunction} transformFn Transform function.\n * Called with a flat array of geometry coordinates.\n */\n applyTransform(transformFn) {\n abstract();\n }\n\n /**\n * Test if the geometry and the passed extent intersect.\n * @abstract\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n */\n intersectsExtent(extent) {\n return abstract();\n }\n\n /**\n * Translate the geometry. This modifies the geometry coordinates in place. If\n * instead you want a new geometry, first `clone()` this geometry.\n * @abstract\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @api\n */\n translate(deltaX, deltaY) {\n abstract();\n }\n\n /**\n * Transform each coordinate of the geometry from one coordinate reference\n * system to another. The geometry is modified in place.\n * For example, a line will be transformed to a line and a circle to a circle.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n *\n * @param {import(\"../proj.js\").ProjectionLike} source The current projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @param {import(\"../proj.js\").ProjectionLike} destination The desired projection. Can be a\n * string identifier or a {@link module:ol/proj/Projection~Projection} object.\n * @return {this} This geometry. Note that original geometry is\n * modified in place.\n * @api\n */\n transform(source, destination) {\n /** @type {import(\"../proj/Projection.js\").default} */\n const sourceProj = getProjection(source);\n const transformFn =\n sourceProj.getUnits() == 'tile-pixels'\n ? function (inCoordinates, outCoordinates, stride) {\n const pixelExtent = sourceProj.getExtent();\n const projectedExtent = sourceProj.getWorldExtent();\n const scale = getHeight(projectedExtent) / getHeight(pixelExtent);\n composeTransform(\n tmpTransform,\n projectedExtent[0],\n projectedExtent[3],\n scale,\n -scale,\n 0,\n 0,\n 0,\n );\n const transformed = transform2D(\n inCoordinates,\n 0,\n inCoordinates.length,\n stride,\n tmpTransform,\n outCoordinates,\n );\n const projTransform = getTransform(sourceProj, destination);\n if (projTransform) {\n return projTransform(transformed, transformed, stride);\n }\n return transformed;\n }\n : getTransform(sourceProj, destination);\n this.applyTransform(transformFn);\n return this;\n }\n}\n\nexport default Geometry;\n","/**\n * @module ol/geom/SimpleGeometry\n */\nimport {createOrUpdateFromFlatCoordinates, getCenter} from '../extent.js';\nimport {abstract} from '../util.js';\nimport Geometry from './Geometry.js';\nimport {rotate, scale, transform2D, translate} from './flat/transform.js';\n\n/**\n * @classdesc\n * Abstract base class; only used for creating subclasses; do not instantiate\n * in apps, as cannot be rendered.\n *\n * @abstract\n * @api\n */\nclass SimpleGeometry extends Geometry {\n constructor() {\n super();\n\n /**\n * @protected\n * @type {import(\"./Geometry.js\").GeometryLayout}\n */\n this.layout = 'XY';\n\n /**\n * @protected\n * @type {number}\n */\n this.stride = 2;\n\n /**\n * @protected\n * @type {Array}\n */\n this.flatCoordinates;\n }\n\n /**\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n * @override\n */\n computeExtent(extent) {\n return createOrUpdateFromFlatCoordinates(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n extent,\n );\n }\n\n /**\n * @abstract\n * @return {Array<*> | null} Coordinates.\n */\n getCoordinates() {\n return abstract();\n }\n\n /**\n * Return the first coordinate of the geometry.\n * @return {import(\"../coordinate.js\").Coordinate} First coordinate.\n * @api\n */\n getFirstCoordinate() {\n return this.flatCoordinates.slice(0, this.stride);\n }\n\n /**\n * @return {Array} Flat coordinates.\n */\n getFlatCoordinates() {\n return this.flatCoordinates;\n }\n\n /**\n * Return the last coordinate of the geometry.\n * @return {import(\"../coordinate.js\").Coordinate} Last point.\n * @api\n */\n getLastCoordinate() {\n return this.flatCoordinates.slice(\n this.flatCoordinates.length - this.stride,\n );\n }\n\n /**\n * Return the {@link import(\"./Geometry.js\").GeometryLayout layout} of the geometry.\n * @return {import(\"./Geometry.js\").GeometryLayout} Layout.\n * @api\n */\n getLayout() {\n return this.layout;\n }\n\n /**\n * Create a simplified version of this geometry using the Douglas Peucker algorithm.\n * @param {number} squaredTolerance Squared tolerance.\n * @return {SimpleGeometry} Simplified geometry.\n * @override\n */\n getSimplifiedGeometry(squaredTolerance) {\n if (this.simplifiedGeometryRevision !== this.getRevision()) {\n this.simplifiedGeometryMaxMinSquaredTolerance = 0;\n this.simplifiedGeometryRevision = this.getRevision();\n }\n // If squaredTolerance is negative or if we know that simplification will not\n // have any effect then just return this.\n if (\n squaredTolerance < 0 ||\n (this.simplifiedGeometryMaxMinSquaredTolerance !== 0 &&\n squaredTolerance <= this.simplifiedGeometryMaxMinSquaredTolerance)\n ) {\n return this;\n }\n\n const simplifiedGeometry =\n this.getSimplifiedGeometryInternal(squaredTolerance);\n const simplifiedFlatCoordinates = simplifiedGeometry.getFlatCoordinates();\n if (simplifiedFlatCoordinates.length < this.flatCoordinates.length) {\n return simplifiedGeometry;\n }\n // Simplification did not actually remove any coordinates. We now know\n // that any calls to getSimplifiedGeometry with a squaredTolerance less\n // than or equal to the current squaredTolerance will also not have any\n // effect. This allows us to short circuit simplification (saving CPU\n // cycles) and prevents the cache of simplified geometries from filling\n // up with useless identical copies of this geometry (saving memory).\n this.simplifiedGeometryMaxMinSquaredTolerance = squaredTolerance;\n return this;\n }\n\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {SimpleGeometry} Simplified geometry.\n * @protected\n */\n getSimplifiedGeometryInternal(squaredTolerance) {\n return this;\n }\n\n /**\n * @return {number} Stride.\n */\n getStride() {\n return this.stride;\n }\n\n /**\n * @param {import(\"./Geometry.js\").GeometryLayout} layout Layout.\n * @param {Array} flatCoordinates Flat coordinates.\n */\n setFlatCoordinates(layout, flatCoordinates) {\n this.stride = getStrideForLayout(layout);\n this.layout = layout;\n this.flatCoordinates = flatCoordinates;\n }\n\n /**\n * @abstract\n * @param {!Array<*>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n setCoordinates(coordinates, layout) {\n abstract();\n }\n\n /**\n * @param {import(\"./Geometry.js\").GeometryLayout|undefined} layout Layout.\n * @param {Array<*>} coordinates Coordinates.\n * @param {number} nesting Nesting.\n * @protected\n */\n setLayout(layout, coordinates, nesting) {\n let stride;\n if (layout) {\n stride = getStrideForLayout(layout);\n } else {\n for (let i = 0; i < nesting; ++i) {\n if (coordinates.length === 0) {\n this.layout = 'XY';\n this.stride = 2;\n return;\n }\n coordinates = /** @type {Array} */ (coordinates[0]);\n }\n stride = coordinates.length;\n layout = getLayoutForStride(stride);\n }\n this.layout = layout;\n this.stride = stride;\n }\n\n /**\n * Apply a transform function to the coordinates of the geometry.\n * The geometry is modified in place.\n * If you do not want the geometry modified in place, first `clone()` it and\n * then use this function on the clone.\n * @param {import(\"../proj.js\").TransformFunction} transformFn Transform function.\n * Called with a flat array of geometry coordinates.\n * @api\n * @override\n */\n applyTransform(transformFn) {\n if (this.flatCoordinates) {\n transformFn(\n this.flatCoordinates,\n this.flatCoordinates,\n this.layout.startsWith('XYZ') ? 3 : 2,\n this.stride,\n );\n this.changed();\n }\n }\n\n /**\n * Rotate the geometry around a given coordinate. This modifies the geometry\n * coordinates in place.\n * @param {number} angle Rotation angle in counter-clockwise radians.\n * @param {import(\"../coordinate.js\").Coordinate} anchor The rotation center.\n * @api\n * @override\n */\n rotate(angle, anchor) {\n const flatCoordinates = this.getFlatCoordinates();\n if (flatCoordinates) {\n const stride = this.getStride();\n rotate(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n stride,\n angle,\n anchor,\n flatCoordinates,\n );\n this.changed();\n }\n }\n\n /**\n * Scale the geometry (with an optional origin). This modifies the geometry\n * coordinates in place.\n * @param {number} sx The scaling factor in the x-direction.\n * @param {number} [sy] The scaling factor in the y-direction (defaults to sx).\n * @param {import(\"../coordinate.js\").Coordinate} [anchor] The scale origin (defaults to the center\n * of the geometry extent).\n * @api\n * @override\n */\n scale(sx, sy, anchor) {\n if (sy === undefined) {\n sy = sx;\n }\n if (!anchor) {\n anchor = getCenter(this.getExtent());\n }\n const flatCoordinates = this.getFlatCoordinates();\n if (flatCoordinates) {\n const stride = this.getStride();\n scale(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n stride,\n sx,\n sy,\n anchor,\n flatCoordinates,\n );\n this.changed();\n }\n }\n\n /**\n * Translate the geometry. This modifies the geometry coordinates in place. If\n * instead you want a new geometry, first `clone()` this geometry.\n * @param {number} deltaX Delta X.\n * @param {number} deltaY Delta Y.\n * @api\n * @override\n */\n translate(deltaX, deltaY) {\n const flatCoordinates = this.getFlatCoordinates();\n if (flatCoordinates) {\n const stride = this.getStride();\n translate(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n stride,\n deltaX,\n deltaY,\n flatCoordinates,\n );\n this.changed();\n }\n }\n}\n\n/**\n * @param {number} stride Stride.\n * @return {import(\"./Geometry.js\").GeometryLayout} layout Layout.\n */\nexport function getLayoutForStride(stride) {\n let layout;\n if (stride == 2) {\n layout = 'XY';\n } else if (stride == 3) {\n layout = 'XYZ';\n } else if (stride == 4) {\n layout = 'XYZM';\n }\n return /** @type {import(\"./Geometry.js\").GeometryLayout} */ (layout);\n}\n\n/**\n * @param {import(\"./Geometry.js\").GeometryLayout} layout Layout.\n * @return {number} Stride.\n */\nexport function getStrideForLayout(layout) {\n let stride;\n if (layout == 'XY') {\n stride = 2;\n } else if (layout == 'XYZ' || layout == 'XYM') {\n stride = 3;\n } else if (layout == 'XYZM') {\n stride = 4;\n }\n return /** @type {number} */ (stride);\n}\n\n/**\n * @param {SimpleGeometry} simpleGeometry Simple geometry.\n * @param {import(\"../transform.js\").Transform} transform Transform.\n * @param {Array} [dest] Destination.\n * @return {Array} Transformed flat coordinates.\n */\nexport function transformGeom2D(simpleGeometry, transform, dest) {\n const flatCoordinates = simpleGeometry.getFlatCoordinates();\n if (!flatCoordinates) {\n return null;\n }\n const stride = simpleGeometry.getStride();\n return transform2D(\n flatCoordinates,\n 0,\n flatCoordinates.length,\n stride,\n transform,\n dest,\n );\n}\n\nexport default SimpleGeometry;\n","/**\n * @module ol/geom/flat/area\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {number} Area.\n */\nexport function linearRing(flatCoordinates, offset, end, stride) {\n let twiceArea = 0;\n const x0 = flatCoordinates[end - stride];\n const y0 = flatCoordinates[end - stride + 1];\n let dx1 = 0;\n let dy1 = 0;\n for (; offset < end; offset += stride) {\n const dx2 = flatCoordinates[offset] - x0;\n const dy2 = flatCoordinates[offset + 1] - y0;\n twiceArea += dy1 * dx2 - dx1 * dy2;\n dx1 = dx2;\n dy1 = dy2;\n }\n return twiceArea / 2;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @return {number} Area.\n */\nexport function linearRings(flatCoordinates, offset, ends, stride) {\n let area = 0;\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n area += linearRing(flatCoordinates, offset, end, stride);\n offset = end;\n }\n return area;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @return {number} Area.\n */\nexport function linearRingss(flatCoordinates, offset, endss, stride) {\n let area = 0;\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n area += linearRings(flatCoordinates, offset, ends, stride);\n offset = ends[ends.length - 1];\n }\n return area;\n}\n","/**\n * @module ol/geom/flat/closest\n */\nimport {lerp, squaredDistance as squaredDx} from '../../math.js';\n\n/**\n * Returns the point on the 2D line segment flatCoordinates[offset1] to\n * flatCoordinates[offset2] that is closest to the point (x, y). Extra\n * dimensions are linearly interpolated.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset1 Offset 1.\n * @param {number} offset2 Offset 2.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n */\nfunction assignClosest(\n flatCoordinates,\n offset1,\n offset2,\n stride,\n x,\n y,\n closestPoint,\n) {\n const x1 = flatCoordinates[offset1];\n const y1 = flatCoordinates[offset1 + 1];\n const dx = flatCoordinates[offset2] - x1;\n const dy = flatCoordinates[offset2 + 1] - y1;\n let offset;\n if (dx === 0 && dy === 0) {\n offset = offset1;\n } else {\n const t = ((x - x1) * dx + (y - y1) * dy) / (dx * dx + dy * dy);\n if (t > 1) {\n offset = offset2;\n } else if (t > 0) {\n for (let i = 0; i < stride; ++i) {\n closestPoint[i] = lerp(\n flatCoordinates[offset1 + i],\n flatCoordinates[offset2 + i],\n t,\n );\n }\n closestPoint.length = stride;\n return;\n } else {\n offset = offset1;\n }\n }\n for (let i = 0; i < stride; ++i) {\n closestPoint[i] = flatCoordinates[offset + i];\n }\n closestPoint.length = stride;\n}\n\n/**\n * Return the squared of the largest distance between any pair of consecutive\n * coordinates.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} max Max squared delta.\n * @return {number} Max squared delta.\n */\nexport function maxSquaredDelta(flatCoordinates, offset, end, stride, max) {\n let x1 = flatCoordinates[offset];\n let y1 = flatCoordinates[offset + 1];\n for (offset += stride; offset < end; offset += stride) {\n const x2 = flatCoordinates[offset];\n const y2 = flatCoordinates[offset + 1];\n const squaredDelta = squaredDx(x1, y1, x2, y2);\n if (squaredDelta > max) {\n max = squaredDelta;\n }\n x1 = x2;\n y1 = y2;\n }\n return max;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} max Max squared delta.\n * @return {number} Max squared delta.\n */\nexport function arrayMaxSquaredDelta(\n flatCoordinates,\n offset,\n ends,\n stride,\n max,\n) {\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n max = maxSquaredDelta(flatCoordinates, offset, end, stride, max);\n offset = end;\n }\n return max;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} max Max squared delta.\n * @return {number} Max squared delta.\n */\nexport function multiArrayMaxSquaredDelta(\n flatCoordinates,\n offset,\n endss,\n stride,\n max,\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n max = arrayMaxSquaredDelta(flatCoordinates, offset, ends, stride, max);\n offset = ends[ends.length - 1];\n }\n return max;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} maxDelta Max delta.\n * @param {boolean} isRing Is ring.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @param {Array} [tmpPoint] Temporary point object.\n * @return {number} Minimum squared distance.\n */\nexport function assignClosestPoint(\n flatCoordinates,\n offset,\n end,\n stride,\n maxDelta,\n isRing,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n tmpPoint,\n) {\n if (offset == end) {\n return minSquaredDistance;\n }\n let i, squaredDistance;\n if (maxDelta === 0) {\n // All points are identical, so just test the first point.\n squaredDistance = squaredDx(\n x,\n y,\n flatCoordinates[offset],\n flatCoordinates[offset + 1],\n );\n if (squaredDistance < minSquaredDistance) {\n for (i = 0; i < stride; ++i) {\n closestPoint[i] = flatCoordinates[offset + i];\n }\n closestPoint.length = stride;\n return squaredDistance;\n }\n return minSquaredDistance;\n }\n tmpPoint = tmpPoint ? tmpPoint : [NaN, NaN];\n let index = offset + stride;\n while (index < end) {\n assignClosest(\n flatCoordinates,\n index - stride,\n index,\n stride,\n x,\n y,\n tmpPoint,\n );\n squaredDistance = squaredDx(x, y, tmpPoint[0], tmpPoint[1]);\n if (squaredDistance < minSquaredDistance) {\n minSquaredDistance = squaredDistance;\n for (i = 0; i < stride; ++i) {\n closestPoint[i] = tmpPoint[i];\n }\n closestPoint.length = stride;\n index += stride;\n } else {\n // Skip ahead multiple points, because we know that all the skipped\n // points cannot be any closer than the closest point we have found so\n // far. We know this because we know how close the current point is, how\n // close the closest point we have found so far is, and the maximum\n // distance between consecutive points. For example, if we're currently\n // at distance 10, the best we've found so far is 3, and that the maximum\n // distance between consecutive points is 2, then we'll need to skip at\n // least (10 - 3) / 2 == 3 (rounded down) points to have any chance of\n // finding a closer point. We use Math.max(..., 1) to ensure that we\n // always advance at least one point, to avoid an infinite loop.\n index +=\n stride *\n Math.max(\n ((Math.sqrt(squaredDistance) - Math.sqrt(minSquaredDistance)) /\n maxDelta) |\n 0,\n 1,\n );\n }\n }\n if (isRing) {\n // Check the closing segment.\n assignClosest(\n flatCoordinates,\n end - stride,\n offset,\n stride,\n x,\n y,\n tmpPoint,\n );\n squaredDistance = squaredDx(x, y, tmpPoint[0], tmpPoint[1]);\n if (squaredDistance < minSquaredDistance) {\n minSquaredDistance = squaredDistance;\n for (i = 0; i < stride; ++i) {\n closestPoint[i] = tmpPoint[i];\n }\n closestPoint.length = stride;\n }\n }\n return minSquaredDistance;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} maxDelta Max delta.\n * @param {boolean} isRing Is ring.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @param {Array} [tmpPoint] Temporary point object.\n * @return {number} Minimum squared distance.\n */\nexport function assignClosestArrayPoint(\n flatCoordinates,\n offset,\n ends,\n stride,\n maxDelta,\n isRing,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n tmpPoint,\n) {\n tmpPoint = tmpPoint ? tmpPoint : [NaN, NaN];\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n minSquaredDistance = assignClosestPoint(\n flatCoordinates,\n offset,\n end,\n stride,\n maxDelta,\n isRing,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n tmpPoint,\n );\n offset = end;\n }\n return minSquaredDistance;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} maxDelta Max delta.\n * @param {boolean} isRing Is ring.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {Array} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @param {Array} [tmpPoint] Temporary point object.\n * @return {number} Minimum squared distance.\n */\nexport function assignClosestMultiArrayPoint(\n flatCoordinates,\n offset,\n endss,\n stride,\n maxDelta,\n isRing,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n tmpPoint,\n) {\n tmpPoint = tmpPoint ? tmpPoint : [NaN, NaN];\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n minSquaredDistance = assignClosestArrayPoint(\n flatCoordinates,\n offset,\n ends,\n stride,\n maxDelta,\n isRing,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n tmpPoint,\n );\n offset = ends[ends.length - 1];\n }\n return minSquaredDistance;\n}\n","/**\n * @module ol/geom/flat/deflate\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {import(\"../../coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {number} stride Stride.\n * @return {number} offset Offset.\n */\nexport function deflateCoordinate(flatCoordinates, offset, coordinate, stride) {\n for (let i = 0, ii = coordinate.length; i < ii; ++i) {\n flatCoordinates[offset++] = coordinate[i];\n }\n return offset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} coordinates Coordinates.\n * @param {number} stride Stride.\n * @return {number} offset Offset.\n */\nexport function deflateCoordinates(\n flatCoordinates,\n offset,\n coordinates,\n stride,\n) {\n for (let i = 0, ii = coordinates.length; i < ii; ++i) {\n const coordinate = coordinates[i];\n for (let j = 0; j < stride; ++j) {\n flatCoordinates[offset++] = coordinate[j];\n }\n }\n return offset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} coordinatess Coordinatess.\n * @param {number} stride Stride.\n * @param {Array} [ends] Ends.\n * @return {Array} Ends.\n */\nexport function deflateCoordinatesArray(\n flatCoordinates,\n offset,\n coordinatess,\n stride,\n ends,\n) {\n ends = ends ? ends : [];\n let i = 0;\n for (let j = 0, jj = coordinatess.length; j < jj; ++j) {\n const end = deflateCoordinates(\n flatCoordinates,\n offset,\n coordinatess[j],\n stride,\n );\n ends[i++] = end;\n offset = end;\n }\n ends.length = i;\n return ends;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>>} coordinatesss Coordinatesss.\n * @param {number} stride Stride.\n * @param {Array>} [endss] Endss.\n * @return {Array>} Endss.\n */\nexport function deflateMultiCoordinatesArray(\n flatCoordinates,\n offset,\n coordinatesss,\n stride,\n endss,\n) {\n endss = endss ? endss : [];\n let i = 0;\n for (let j = 0, jj = coordinatesss.length; j < jj; ++j) {\n const ends = deflateCoordinatesArray(\n flatCoordinates,\n offset,\n coordinatesss[j],\n stride,\n endss[i],\n );\n if (ends.length === 0) {\n ends[0] = offset;\n }\n endss[i++] = ends;\n offset = ends[ends.length - 1];\n }\n endss.length = i;\n return endss;\n}\n","/**\n * @module ol/geom/flat/inflate\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {Array} [coordinates] Coordinates.\n * @return {Array} Coordinates.\n */\nexport function inflateCoordinates(\n flatCoordinates,\n offset,\n end,\n stride,\n coordinates,\n) {\n coordinates = coordinates !== undefined ? coordinates : [];\n let i = 0;\n for (let j = offset; j < end; j += stride) {\n coordinates[i++] = flatCoordinates.slice(j, j + stride);\n }\n coordinates.length = i;\n return coordinates;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {Array>} [coordinatess] Coordinatess.\n * @return {Array>} Coordinatess.\n */\nexport function inflateCoordinatesArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n coordinatess,\n) {\n coordinatess = coordinatess !== undefined ? coordinatess : [];\n let i = 0;\n for (let j = 0, jj = ends.length; j < jj; ++j) {\n const end = ends[j];\n coordinatess[i++] = inflateCoordinates(\n flatCoordinates,\n offset,\n end,\n stride,\n coordinatess[i],\n );\n offset = end;\n }\n coordinatess.length = i;\n return coordinatess;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {Array>>} [coordinatesss]\n * Coordinatesss.\n * @return {Array>>} Coordinatesss.\n */\nexport function inflateMultiCoordinatesArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n coordinatesss,\n) {\n coordinatesss = coordinatesss !== undefined ? coordinatesss : [];\n let i = 0;\n for (let j = 0, jj = endss.length; j < jj; ++j) {\n const ends = endss[j];\n coordinatesss[i++] =\n ends.length === 1 && ends[0] === offset\n ? []\n : inflateCoordinatesArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n coordinatesss[i],\n );\n offset = ends[ends.length - 1];\n }\n coordinatesss.length = i;\n return coordinatesss;\n}\n","/**\n * @module ol/geom/flat/contains\n */\nimport {forEachCorner} from '../../extent.js';\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @return {boolean} Contains extent.\n */\nexport function linearRingContainsExtent(\n flatCoordinates,\n offset,\n end,\n stride,\n extent,\n) {\n const outside = forEachCorner(\n extent,\n /**\n * @param {import(\"../../coordinate.js\").Coordinate} coordinate Coordinate.\n * @return {boolean} Contains (x, y).\n */\n function (coordinate) {\n return !linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n coordinate[0],\n coordinate[1],\n );\n },\n );\n return !outside;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\nexport function linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n x,\n y,\n) {\n // https://web.archive.org/web/20210504233957/http://geomalgorithms.com/a03-_inclusion.html\n // Copyright 2000 softSurfer, 2012 Dan Sunday\n // This code may be freely used and modified for any purpose\n // providing that this copyright notice is included with it.\n // SoftSurfer makes no warranty for this code, and cannot be held\n // liable for any real or imagined damage resulting from its use.\n // Users of this code must verify correctness for their application.\n let wn = 0;\n let x1 = flatCoordinates[end - stride];\n let y1 = flatCoordinates[end - stride + 1];\n for (; offset < end; offset += stride) {\n const x2 = flatCoordinates[offset];\n const y2 = flatCoordinates[offset + 1];\n if (y1 <= y) {\n if (y2 > y && (x2 - x1) * (y - y1) - (x - x1) * (y2 - y1) > 0) {\n wn++;\n }\n } else if (y2 <= y && (x2 - x1) * (y - y1) - (x - x1) * (y2 - y1) < 0) {\n wn--;\n }\n x1 = x2;\n y1 = y2;\n }\n return wn !== 0;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\nexport function linearRingsContainsXY(\n flatCoordinates,\n offset,\n ends,\n stride,\n x,\n y,\n) {\n if (ends.length === 0) {\n return false;\n }\n if (!linearRingContainsXY(flatCoordinates, offset, ends[0], stride, x, y)) {\n return false;\n }\n for (let i = 1, ii = ends.length; i < ii; ++i) {\n if (\n linearRingContainsXY(flatCoordinates, ends[i - 1], ends[i], stride, x, y)\n ) {\n return false;\n }\n }\n return true;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n */\nexport function linearRingssContainsXY(\n flatCoordinates,\n offset,\n endss,\n stride,\n x,\n y,\n) {\n if (endss.length === 0) {\n return false;\n }\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n if (linearRingsContainsXY(flatCoordinates, offset, ends, stride, x, y)) {\n return true;\n }\n offset = ends[ends.length - 1];\n }\n return false;\n}\n","/**\n * @module ol/geom/flat/segments\n */\n\n/**\n * This function calls `callback` for each segment of the flat coordinates\n * array. If the callback returns a truthy value the function returns that\n * value immediately. Otherwise the function returns `false`.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {function(import(\"../../coordinate.js\").Coordinate, import(\"../../coordinate.js\").Coordinate): T} callback Function\n * called for each segment.\n * @return {T|boolean} Value.\n * @template T\n */\nexport function forEach(flatCoordinates, offset, end, stride, callback) {\n let ret;\n offset += stride;\n for (; offset < end; offset += stride) {\n ret = callback(\n flatCoordinates.slice(offset - stride, offset),\n flatCoordinates.slice(offset, offset + stride),\n );\n if (ret) {\n return ret;\n }\n }\n return false;\n}\n\n/**\n * Calculate the intersection point of two line segments.\n * Reference: https://stackoverflow.com/a/72474223/2389327\n * @param {Array} segment1 The first line segment as an array of two points.\n * @param {Array} segment2 The second line segment as an array of two points.\n * @return {import(\"../../coordinate.js\").Coordinate|undefined} The intersection point or `undefined` if no intersection.\n */\nexport function getIntersectionPoint(segment1, segment2) {\n const [a, b] = segment1;\n const [c, d] = segment2;\n const t =\n ((a[0] - c[0]) * (c[1] - d[1]) - (a[1] - c[1]) * (c[0] - d[0])) /\n ((a[0] - b[0]) * (c[1] - d[1]) - (a[1] - b[1]) * (c[0] - d[0]));\n const u =\n ((a[0] - c[0]) * (a[1] - b[1]) - (a[1] - c[1]) * (a[0] - b[0])) /\n ((a[0] - b[0]) * (c[1] - d[1]) - (a[1] - b[1]) * (c[0] - d[0]));\n\n // Check if lines actually intersect\n if (0 <= t && t <= 1 && 0 <= u && u <= 1) {\n return [a[0] + t * (b[0] - a[0]), a[1] + t * (b[1] - a[1])];\n }\n return undefined;\n}\n","/**\n * @module ol/geom/flat/intersectsextent\n */\nimport {\n createEmpty,\n extendFlatCoordinates,\n intersects,\n intersectsSegment,\n} from '../../extent.js';\nimport {linearRingContainsExtent, linearRingContainsXY} from './contains.js';\nimport {forEach as forEachSegment} from './segments.js';\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @param {import('../../extent.js').Extent} [coordinatesExtent] Coordinates extent\n * @return {boolean} True if the geometry and the extent intersect.\n */\nexport function intersectsLineString(\n flatCoordinates,\n offset,\n end,\n stride,\n extent,\n coordinatesExtent,\n) {\n coordinatesExtent =\n coordinatesExtent ??\n extendFlatCoordinates(createEmpty(), flatCoordinates, offset, end, stride);\n if (!intersects(extent, coordinatesExtent)) {\n return false;\n }\n if (\n (coordinatesExtent[0] >= extent[0] && coordinatesExtent[2] <= extent[2]) ||\n (coordinatesExtent[1] >= extent[1] && coordinatesExtent[3] <= extent[3])\n ) {\n return true;\n }\n return forEachSegment(\n flatCoordinates,\n offset,\n end,\n stride,\n /**\n * @param {import(\"../../coordinate.js\").Coordinate} point1 Start point.\n * @param {import(\"../../coordinate.js\").Coordinate} point2 End point.\n * @return {boolean} `true` if the segment and the extent intersect,\n * `false` otherwise.\n */\n function (point1, point2) {\n return intersectsSegment(extent, point1, point2);\n },\n );\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\nexport function intersectsLineStringArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n extent,\n) {\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n if (\n intersectsLineString(flatCoordinates, offset, ends[i], stride, extent)\n ) {\n return true;\n }\n offset = ends[i];\n }\n return false;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\nexport function intersectsLinearRing(\n flatCoordinates,\n offset,\n end,\n stride,\n extent,\n) {\n if (intersectsLineString(flatCoordinates, offset, end, stride, extent)) {\n return true;\n }\n if (\n linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n extent[0],\n extent[1],\n )\n ) {\n return true;\n }\n if (\n linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n extent[0],\n extent[3],\n )\n ) {\n return true;\n }\n if (\n linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n extent[2],\n extent[1],\n )\n ) {\n return true;\n }\n if (\n linearRingContainsXY(\n flatCoordinates,\n offset,\n end,\n stride,\n extent[2],\n extent[3],\n )\n ) {\n return true;\n }\n return false;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\nexport function intersectsLinearRingArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n extent,\n) {\n if (!intersectsLinearRing(flatCoordinates, offset, ends[0], stride, extent)) {\n return false;\n }\n if (ends.length === 1) {\n return true;\n }\n for (let i = 1, ii = ends.length; i < ii; ++i) {\n if (\n linearRingContainsExtent(\n flatCoordinates,\n ends[i - 1],\n ends[i],\n stride,\n extent,\n )\n ) {\n if (\n !intersectsLineString(\n flatCoordinates,\n ends[i - 1],\n ends[i],\n stride,\n extent,\n )\n ) {\n return false;\n }\n }\n }\n return true;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {import(\"../../extent.js\").Extent} extent Extent.\n * @return {boolean} True if the geometry and the extent intersect.\n */\nexport function intersectsLinearRingMultiArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n extent,\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n if (\n intersectsLinearRingArray(flatCoordinates, offset, ends, stride, extent)\n ) {\n return true;\n }\n offset = ends[ends.length - 1];\n }\n return false;\n}\n","/**\n * @module ol/geom/flat/simplify\n */\n// Based on simplify-js https://github.com/mourner/simplify-js\n// Copyright (c) 2012, Vladimir Agafonkin\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// 1. Redistributions of source code must retain the above copyright notice,\n// this list of conditions and the following disclaimer.\n//\n// 2. Redistributions in binary form must reproduce the above copyright\n// notice, this list of conditions and the following disclaimer in the\n// documentation and/or other materials provided with the distribution.\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\n// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE\n// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR\n// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF\n// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS\n// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN\n// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)\n// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE\n// POSSIBILITY OF SUCH DAMAGE.\n\nimport {squaredDistance, squaredSegmentDistance} from '../../math.js';\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {boolean} highQuality Highest quality.\n * @param {Array} [simplifiedFlatCoordinates] Simplified flat\n * coordinates.\n * @return {Array} Simplified line string.\n */\nexport function simplifyLineString(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n highQuality,\n simplifiedFlatCoordinates,\n) {\n simplifiedFlatCoordinates =\n simplifiedFlatCoordinates !== undefined ? simplifiedFlatCoordinates : [];\n if (!highQuality) {\n end = radialDistance(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n 0,\n );\n flatCoordinates = simplifiedFlatCoordinates;\n offset = 0;\n stride = 2;\n }\n simplifiedFlatCoordinates.length = douglasPeucker(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n 0,\n );\n return simplifiedFlatCoordinates;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @return {number} Simplified offset.\n */\nexport function douglasPeucker(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n) {\n const n = (end - offset) / stride;\n if (n < 3) {\n for (; offset < end; offset += stride) {\n simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset];\n simplifiedFlatCoordinates[simplifiedOffset++] =\n flatCoordinates[offset + 1];\n }\n return simplifiedOffset;\n }\n /** @type {Array} */\n const markers = new Array(n);\n markers[0] = 1;\n markers[n - 1] = 1;\n /** @type {Array} */\n const stack = [offset, end - stride];\n let index = 0;\n while (stack.length > 0) {\n const last = stack.pop();\n const first = stack.pop();\n let maxSquaredDistance = 0;\n const x1 = flatCoordinates[first];\n const y1 = flatCoordinates[first + 1];\n const x2 = flatCoordinates[last];\n const y2 = flatCoordinates[last + 1];\n for (let i = first + stride; i < last; i += stride) {\n const x = flatCoordinates[i];\n const y = flatCoordinates[i + 1];\n const squaredDistance = squaredSegmentDistance(x, y, x1, y1, x2, y2);\n if (squaredDistance > maxSquaredDistance) {\n index = i;\n maxSquaredDistance = squaredDistance;\n }\n }\n if (maxSquaredDistance > squaredTolerance) {\n markers[(index - offset) / stride] = 1;\n if (first + stride < index) {\n stack.push(first, index);\n }\n if (index + stride < last) {\n stack.push(index, last);\n }\n }\n }\n for (let i = 0; i < n; ++i) {\n if (markers[i]) {\n simplifiedFlatCoordinates[simplifiedOffset++] =\n flatCoordinates[offset + i * stride];\n simplifiedFlatCoordinates[simplifiedOffset++] =\n flatCoordinates[offset + i * stride + 1];\n }\n }\n return simplifiedOffset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array} simplifiedEnds Simplified ends.\n * @return {number} Simplified offset.\n */\nexport function douglasPeuckerArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEnds,\n) {\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n simplifiedOffset = douglasPeucker(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n );\n simplifiedEnds.push(simplifiedOffset);\n offset = end;\n }\n return simplifiedOffset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array>} simplifiedEndss Simplified endss.\n * @return {number} Simplified offset.\n */\nexport function douglasPeuckerMultiArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEndss,\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n /** @type {Array} */\n const simplifiedEnds = [];\n simplifiedOffset = douglasPeuckerArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEnds,\n );\n simplifiedEndss.push(simplifiedEnds);\n offset = ends[ends.length - 1];\n }\n return simplifiedOffset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} squaredTolerance Squared tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @return {number} Simplified offset.\n */\nexport function radialDistance(\n flatCoordinates,\n offset,\n end,\n stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n) {\n if (end <= offset + stride) {\n // zero or one point, no simplification possible, so copy and return\n for (; offset < end; offset += stride) {\n simplifiedFlatCoordinates[simplifiedOffset++] = flatCoordinates[offset];\n simplifiedFlatCoordinates[simplifiedOffset++] =\n flatCoordinates[offset + 1];\n }\n return simplifiedOffset;\n }\n let x1 = flatCoordinates[offset];\n let y1 = flatCoordinates[offset + 1];\n // copy first point\n simplifiedFlatCoordinates[simplifiedOffset++] = x1;\n simplifiedFlatCoordinates[simplifiedOffset++] = y1;\n let x2 = x1;\n let y2 = y1;\n for (offset += stride; offset < end; offset += stride) {\n x2 = flatCoordinates[offset];\n y2 = flatCoordinates[offset + 1];\n if (squaredDistance(x1, y1, x2, y2) > squaredTolerance) {\n // copy point at offset\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n x1 = x2;\n y1 = y2;\n }\n }\n if (x2 != x1 || y2 != y1) {\n // copy last point\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n }\n return simplifiedOffset;\n}\n\n/**\n * @param {number} value Value.\n * @param {number} tolerance Tolerance.\n * @return {number} Rounded value.\n */\nexport function snap(value, tolerance) {\n return tolerance * Math.round(value / tolerance);\n}\n\n/**\n * Simplifies a line string using an algorithm designed by Tim Schaub.\n * Coordinates are snapped to the nearest value in a virtual grid and\n * consecutive duplicate coordinates are discarded. This effectively preserves\n * topology as the simplification of any subsection of a line string is\n * independent of the rest of the line string. This means that, for examples,\n * the common edge between two polygons will be simplified to the same line\n * string independently in both polygons. This implementation uses a single\n * pass over the coordinates and eliminates intermediate collinear points.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @param {number} tolerance Tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @return {number} Simplified offset.\n */\nexport function quantize(\n flatCoordinates,\n offset,\n end,\n stride,\n tolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n) {\n // do nothing if the line is empty\n if (offset == end) {\n return simplifiedOffset;\n }\n // snap the first coordinate (P1)\n let x1 = snap(flatCoordinates[offset], tolerance);\n let y1 = snap(flatCoordinates[offset + 1], tolerance);\n offset += stride;\n // add the first coordinate to the output\n simplifiedFlatCoordinates[simplifiedOffset++] = x1;\n simplifiedFlatCoordinates[simplifiedOffset++] = y1;\n // find the next coordinate that does not snap to the same value as the first\n // coordinate (P2)\n let x2, y2;\n do {\n x2 = snap(flatCoordinates[offset], tolerance);\n y2 = snap(flatCoordinates[offset + 1], tolerance);\n offset += stride;\n if (offset == end) {\n // all coordinates snap to the same value, the line collapses to a point\n // push the last snapped value anyway to ensure that the output contains\n // at least two points\n // FIXME should we really return at least two points anyway?\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n return simplifiedOffset;\n }\n } while (x2 == x1 && y2 == y1);\n while (offset < end) {\n // snap the next coordinate (P3)\n const x3 = snap(flatCoordinates[offset], tolerance);\n const y3 = snap(flatCoordinates[offset + 1], tolerance);\n offset += stride;\n // skip P3 if it is equal to P2\n if (x3 == x2 && y3 == y2) {\n continue;\n }\n // calculate the delta between P1 and P2\n const dx1 = x2 - x1;\n const dy1 = y2 - y1;\n // calculate the delta between P3 and P1\n const dx2 = x3 - x1;\n const dy2 = y3 - y1;\n // if P1, P2, and P3 are colinear and P3 is further from P1 than P2 is from\n // P1 in the same direction then P2 is on the straight line between P1 and\n // P3\n if (\n dx1 * dy2 == dy1 * dx2 &&\n ((dx1 < 0 && dx2 < dx1) || dx1 == dx2 || (dx1 > 0 && dx2 > dx1)) &&\n ((dy1 < 0 && dy2 < dy1) || dy1 == dy2 || (dy1 > 0 && dy2 > dy1))\n ) {\n // discard P2 and set P2 = P3\n x2 = x3;\n y2 = y3;\n continue;\n }\n // either P1, P2, and P3 are not colinear, or they are colinear but P3 is\n // between P3 and P1 or on the opposite half of the line to P2. add P2,\n // and continue with P1 = P2 and P2 = P3\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n x1 = x2;\n y1 = y2;\n x2 = x3;\n y2 = y3;\n }\n // add the last point (P2)\n simplifiedFlatCoordinates[simplifiedOffset++] = x2;\n simplifiedFlatCoordinates[simplifiedOffset++] = y2;\n return simplifiedOffset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {number} tolerance Tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array} simplifiedEnds Simplified ends.\n * @return {number} Simplified offset.\n */\nexport function quantizeArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n tolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEnds,\n) {\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n simplifiedOffset = quantize(\n flatCoordinates,\n offset,\n end,\n stride,\n tolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n );\n simplifiedEnds.push(simplifiedOffset);\n offset = end;\n }\n return simplifiedOffset;\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {number} tolerance Tolerance.\n * @param {Array} simplifiedFlatCoordinates Simplified flat\n * coordinates.\n * @param {number} simplifiedOffset Simplified offset.\n * @param {Array>} simplifiedEndss Simplified endss.\n * @return {number} Simplified offset.\n */\nexport function quantizeMultiArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n tolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEndss,\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n /** @type {Array} */\n const simplifiedEnds = [];\n simplifiedOffset = quantizeArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n tolerance,\n simplifiedFlatCoordinates,\n simplifiedOffset,\n simplifiedEnds,\n );\n simplifiedEndss.push(simplifiedEnds);\n offset = ends[ends.length - 1];\n }\n return simplifiedOffset;\n}\n","/**\n * @module ol/geom/LinearRing\n */\nimport {closestSquaredDistanceXY} from '../extent.js';\nimport SimpleGeometry from './SimpleGeometry.js';\nimport {linearRing as linearRingArea} from './flat/area.js';\nimport {assignClosestPoint, maxSquaredDelta} from './flat/closest.js';\nimport {deflateCoordinates} from './flat/deflate.js';\nimport {inflateCoordinates} from './flat/inflate.js';\nimport {intersectsLineString} from './flat/intersectsextent.js';\nimport {douglasPeucker} from './flat/simplify.js';\n\n/**\n * @classdesc\n * Linear ring geometry. Only used as part of polygon; cannot be rendered\n * on its own.\n *\n * @api\n */\nclass LinearRing extends SimpleGeometry {\n /**\n * @param {Array|Array} coordinates Coordinates.\n * For internal use, flat coordinates in combination with `layout` are also accepted.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n constructor(coordinates, layout) {\n super();\n\n /**\n * @private\n * @type {number}\n */\n this.maxDelta_ = -1;\n\n /**\n * @private\n * @type {number}\n */\n this.maxDeltaRevision_ = -1;\n\n if (layout !== undefined && !Array.isArray(coordinates[0])) {\n this.setFlatCoordinates(\n layout,\n /** @type {Array} */ (coordinates),\n );\n } else {\n this.setCoordinates(\n /** @type {Array} */ (\n coordinates\n ),\n layout,\n );\n }\n }\n\n /**\n * Make a complete copy of the geometry.\n * @return {!LinearRing} Clone.\n * @api\n * @override\n */\n clone() {\n return new LinearRing(this.flatCoordinates.slice(), this.layout);\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n * @override\n */\n closestPointXY(x, y, closestPoint, minSquaredDistance) {\n if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {\n return minSquaredDistance;\n }\n if (this.maxDeltaRevision_ != this.getRevision()) {\n this.maxDelta_ = Math.sqrt(\n maxSquaredDelta(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n 0,\n ),\n );\n this.maxDeltaRevision_ = this.getRevision();\n }\n return assignClosestPoint(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n this.maxDelta_,\n true,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n );\n }\n\n /**\n * Return the area of the linear ring on projected plane.\n * @return {number} Area (on projected plane).\n * @api\n */\n getArea() {\n return linearRingArea(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n );\n }\n\n /**\n * Return the coordinates of the linear ring.\n * @return {Array} Coordinates.\n * @api\n * @override\n */\n getCoordinates() {\n return inflateCoordinates(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n );\n }\n\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {LinearRing} Simplified LinearRing.\n * @protected\n * @override\n */\n getSimplifiedGeometryInternal(squaredTolerance) {\n /** @type {Array} */\n const simplifiedFlatCoordinates = [];\n simplifiedFlatCoordinates.length = douglasPeucker(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n squaredTolerance,\n simplifiedFlatCoordinates,\n 0,\n );\n return new LinearRing(simplifiedFlatCoordinates, 'XY');\n }\n\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n * @override\n */\n getType() {\n return 'LinearRing';\n }\n\n /**\n * Test if the geometry and the passed extent intersect. A linear ring is\n * treated as a line string for this test.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n * @override\n */\n intersectsExtent(extent) {\n return intersectsLineString(\n this.flatCoordinates,\n 0,\n this.flatCoordinates.length,\n this.stride,\n extent,\n );\n }\n\n /**\n * Set the coordinates of the linear ring.\n * @param {!Array} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n * @override\n */\n setCoordinates(coordinates, layout) {\n this.setLayout(layout, coordinates, 1);\n if (!this.flatCoordinates) {\n this.flatCoordinates = [];\n }\n this.flatCoordinates.length = deflateCoordinates(\n this.flatCoordinates,\n 0,\n coordinates,\n this.stride,\n );\n this.changed();\n }\n}\n\nexport default LinearRing;\n","/**\n * @module ol/geom/Point\n */\nimport {containsXY, createOrUpdateFromCoordinate} from '../extent.js';\nimport {squaredDistance as squaredDx} from '../math.js';\nimport SimpleGeometry from './SimpleGeometry.js';\nimport {deflateCoordinate} from './flat/deflate.js';\n\n/**\n * @classdesc\n * Point geometry.\n *\n * @api\n */\nclass Point extends SimpleGeometry {\n /**\n * @param {import(\"../coordinate.js\").Coordinate} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n */\n constructor(coordinates, layout) {\n super();\n this.setCoordinates(coordinates, layout);\n }\n\n /**\n * Make a complete copy of the geometry.\n * @return {!Point} Clone.\n * @api\n * @override\n */\n clone() {\n const point = new Point(this.flatCoordinates.slice(), this.layout);\n point.applyProperties(this);\n return point;\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n * @override\n */\n closestPointXY(x, y, closestPoint, minSquaredDistance) {\n const flatCoordinates = this.flatCoordinates;\n const squaredDistance = squaredDx(\n x,\n y,\n flatCoordinates[0],\n flatCoordinates[1],\n );\n if (squaredDistance < minSquaredDistance) {\n const stride = this.stride;\n for (let i = 0; i < stride; ++i) {\n closestPoint[i] = flatCoordinates[i];\n }\n closestPoint.length = stride;\n return squaredDistance;\n }\n return minSquaredDistance;\n }\n\n /**\n * Return the coordinate of the point.\n * @return {import(\"../coordinate.js\").Coordinate} Coordinates.\n * @api\n * @override\n */\n getCoordinates() {\n return this.flatCoordinates.slice();\n }\n\n /**\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @protected\n * @return {import(\"../extent.js\").Extent} extent Extent.\n * @override\n */\n computeExtent(extent) {\n return createOrUpdateFromCoordinate(this.flatCoordinates, extent);\n }\n\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n * @override\n */\n getType() {\n return 'Point';\n }\n\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n * @override\n */\n intersectsExtent(extent) {\n return containsXY(extent, this.flatCoordinates[0], this.flatCoordinates[1]);\n }\n\n /**\n * @param {!Array<*>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n * @override\n */\n setCoordinates(coordinates, layout) {\n this.setLayout(layout, coordinates, 0);\n if (!this.flatCoordinates) {\n this.flatCoordinates = [];\n }\n this.flatCoordinates.length = deflateCoordinate(\n this.flatCoordinates,\n 0,\n coordinates,\n this.stride,\n );\n this.changed();\n }\n}\n\nexport default Point;\n","/**\n * @module ol/geom/flat/interiorpoint\n */\nimport {ascending} from '../../array.js';\nimport {linearRingsContainsXY} from './contains.js';\n\n/**\n * Calculates a point that is likely to lie in the interior of the linear rings.\n * Inspired by JTS's com.vividsolutions.jts.geom.Geometry#getInteriorPoint.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {Array} flatCenters Flat centers.\n * @param {number} flatCentersOffset Flat center offset.\n * @param {Array} [dest] Destination.\n * @return {Array} Destination point as XYM coordinate, where M is the\n * length of the horizontal intersection that the point belongs to.\n */\nexport function getInteriorPointOfArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n flatCenters,\n flatCentersOffset,\n dest,\n) {\n let i, ii, x, x1, x2, y1, y2;\n const y = flatCenters[flatCentersOffset + 1];\n /** @type {Array} */\n const intersections = [];\n // Calculate intersections with the horizontal line\n for (let r = 0, rr = ends.length; r < rr; ++r) {\n const end = ends[r];\n x1 = flatCoordinates[end - stride];\n y1 = flatCoordinates[end - stride + 1];\n for (i = offset; i < end; i += stride) {\n x2 = flatCoordinates[i];\n y2 = flatCoordinates[i + 1];\n if ((y <= y1 && y2 <= y) || (y1 <= y && y <= y2)) {\n x = ((y - y1) / (y2 - y1)) * (x2 - x1) + x1;\n intersections.push(x);\n }\n x1 = x2;\n y1 = y2;\n }\n }\n // Find the longest segment of the horizontal line that has its center point\n // inside the linear ring.\n let pointX = NaN;\n let maxSegmentLength = -Infinity;\n intersections.sort(ascending);\n x1 = intersections[0];\n for (i = 1, ii = intersections.length; i < ii; ++i) {\n x2 = intersections[i];\n const segmentLength = Math.abs(x2 - x1);\n if (segmentLength > maxSegmentLength) {\n x = (x1 + x2) / 2;\n if (linearRingsContainsXY(flatCoordinates, offset, ends, stride, x, y)) {\n pointX = x;\n maxSegmentLength = segmentLength;\n }\n }\n x1 = x2;\n }\n if (isNaN(pointX)) {\n // There is no horizontal line that has its center point inside the linear\n // ring. Use the center of the the linear ring's extent.\n pointX = flatCenters[flatCentersOffset];\n }\n if (dest) {\n dest.push(pointX, y, maxSegmentLength);\n return dest;\n }\n return [pointX, y, maxSegmentLength];\n}\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Endss.\n * @param {number} stride Stride.\n * @param {Array} flatCenters Flat centers.\n * @return {Array} Interior points as XYM coordinates, where M is the\n * length of the horizontal intersection that the point belongs to.\n */\nexport function getInteriorPointsOfMultiArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n flatCenters,\n) {\n /** @type {Array} */\n let interiorPoints = [];\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n interiorPoints = getInteriorPointOfArray(\n flatCoordinates,\n offset,\n ends,\n stride,\n flatCenters,\n 2 * i,\n interiorPoints,\n );\n offset = ends[ends.length - 1];\n }\n return interiorPoints;\n}\n","/**\n * @module ol/geom/flat/reverse\n */\n\n/**\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n */\nexport function coordinates(flatCoordinates, offset, end, stride) {\n while (offset < end - stride) {\n for (let i = 0; i < stride; ++i) {\n const tmp = flatCoordinates[offset + i];\n flatCoordinates[offset + i] = flatCoordinates[end - stride + i];\n flatCoordinates[end - stride + i] = tmp;\n }\n offset += stride;\n end -= stride;\n }\n}\n","/**\n * @module ol/geom/flat/orient\n */\nimport {coordinates as reverseCoordinates} from './reverse.js';\n\n/**\n * Is the linear ring oriented clockwise in a coordinate system with a bottom-left\n * coordinate origin? For a coordinate system with a top-left coordinate origin,\n * the ring's orientation is clockwise when this function returns false.\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {number} end End.\n * @param {number} stride Stride.\n * @return {boolean|undefined} Is clockwise.\n */\nexport function linearRingIsClockwise(flatCoordinates, offset, end, stride) {\n // https://stackoverflow.com/q/1165647/clockwise-method#1165943\n // https://github.com/OSGeo/gdal/blob/master/gdal/ogr/ogrlinearring.cpp\n let edge = 0;\n let x1 = flatCoordinates[end - stride];\n let y1 = flatCoordinates[end - stride + 1];\n for (; offset < end; offset += stride) {\n const x2 = flatCoordinates[offset];\n const y2 = flatCoordinates[offset + 1];\n edge += (x2 - x1) * (y2 + y1);\n x1 = x2;\n y1 = y2;\n }\n return edge === 0 ? undefined : edge > 0;\n}\n\n/**\n * Determines if linear rings are oriented. By default, left-hand orientation\n * is tested (first ring must be clockwise, remaining rings counter-clockwise).\n * To test for right-hand orientation, use the `right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Array of end indexes.\n * @param {number} stride Stride.\n * @param {boolean} [right] Test for right-hand orientation\n * (counter-clockwise exterior ring and clockwise interior rings).\n * @return {boolean} Rings are correctly oriented.\n */\nexport function linearRingsAreOriented(\n flatCoordinates,\n offset,\n ends,\n stride,\n right,\n) {\n right = right !== undefined ? right : false;\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n const isClockwise = linearRingIsClockwise(\n flatCoordinates,\n offset,\n end,\n stride,\n );\n if (i === 0) {\n if ((right && isClockwise) || (!right && !isClockwise)) {\n return false;\n }\n } else {\n if ((right && !isClockwise) || (!right && isClockwise)) {\n return false;\n }\n }\n offset = end;\n }\n return true;\n}\n\n/**\n * Determines if linear rings are oriented. By default, left-hand orientation\n * is tested (first ring must be clockwise, remaining rings counter-clockwise).\n * To test for right-hand orientation, use the `right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Array of array of end indexes.\n * @param {number} stride Stride.\n * @param {boolean} [right] Test for right-hand orientation\n * (counter-clockwise exterior ring and clockwise interior rings).\n * @return {boolean} Rings are correctly oriented.\n */\nexport function linearRingssAreOriented(\n flatCoordinates,\n offset,\n endss,\n stride,\n right,\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n const ends = endss[i];\n if (!linearRingsAreOriented(flatCoordinates, offset, ends, stride, right)) {\n return false;\n }\n if (ends.length) {\n offset = ends[ends.length - 1];\n }\n }\n return true;\n}\n\n/**\n * Orient coordinates in a flat array of linear rings. By default, rings\n * are oriented following the left-hand rule (clockwise for exterior and\n * counter-clockwise for interior rings). To orient according to the\n * right-hand rule, use the `right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array} ends Ends.\n * @param {number} stride Stride.\n * @param {boolean} [right] Follow the right-hand rule for orientation.\n * @return {number} End.\n */\nexport function orientLinearRings(\n flatCoordinates,\n offset,\n ends,\n stride,\n right,\n) {\n right = right !== undefined ? right : false;\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n const isClockwise = linearRingIsClockwise(\n flatCoordinates,\n offset,\n end,\n stride,\n );\n const reverse =\n i === 0\n ? (right && isClockwise) || (!right && !isClockwise)\n : (right && !isClockwise) || (!right && isClockwise);\n if (reverse) {\n reverseCoordinates(flatCoordinates, offset, end, stride);\n }\n offset = end;\n }\n return offset;\n}\n\n/**\n * Orient coordinates in a flat array of linear rings. By default, rings\n * are oriented following the left-hand rule (clockwise for exterior and\n * counter-clockwise for interior rings). To orient according to the\n * right-hand rule, use the `right` argument.\n *\n * @param {Array} flatCoordinates Flat coordinates.\n * @param {number} offset Offset.\n * @param {Array>} endss Array of array of end indexes.\n * @param {number} stride Stride.\n * @param {boolean} [right] Follow the right-hand rule for orientation.\n * @return {number} End.\n */\nexport function orientLinearRingsArray(\n flatCoordinates,\n offset,\n endss,\n stride,\n right,\n) {\n for (let i = 0, ii = endss.length; i < ii; ++i) {\n offset = orientLinearRings(\n flatCoordinates,\n offset,\n endss[i],\n stride,\n right,\n );\n }\n return offset;\n}\n\n/**\n * Return a two-dimensional endss\n * @param {Array} flatCoordinates Flat coordinates\n * @param {Array} ends Linear ring end indexes\n * @return {Array>} Two dimensional endss array that can\n * be used to construct a MultiPolygon\n */\nexport function inflateEnds(flatCoordinates, ends) {\n const endss = [];\n let offset = 0;\n let prevEndIndex = 0;\n let startOrientation;\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n // classifies an array of rings into polygons with outer rings and holes\n const orientation = linearRingIsClockwise(flatCoordinates, offset, end, 2);\n if (startOrientation === undefined) {\n startOrientation = orientation;\n }\n if (orientation === startOrientation) {\n endss.push(ends.slice(prevEndIndex, i + 1));\n } else {\n if (endss.length === 0) {\n continue;\n }\n endss[endss.length - 1].push(ends[prevEndIndex]);\n }\n prevEndIndex = i + 1;\n offset = end;\n }\n return endss;\n}\n","/**\n * @module ol/geom/Polygon\n */\nimport {extend} from '../array.js';\nimport {closestSquaredDistanceXY, getCenter, isEmpty} from '../extent.js';\nimport {modulo} from '../math.js';\nimport {offset as sphereOffset} from '../sphere.js';\nimport LinearRing from './LinearRing.js';\nimport Point from './Point.js';\nimport SimpleGeometry from './SimpleGeometry.js';\nimport {linearRings as linearRingsArea} from './flat/area.js';\nimport {arrayMaxSquaredDelta, assignClosestArrayPoint} from './flat/closest.js';\nimport {linearRingsContainsXY} from './flat/contains.js';\nimport {deflateCoordinatesArray} from './flat/deflate.js';\nimport {inflateCoordinatesArray} from './flat/inflate.js';\nimport {getInteriorPointOfArray} from './flat/interiorpoint.js';\nimport {intersectsLinearRingArray} from './flat/intersectsextent.js';\nimport {linearRingsAreOriented, orientLinearRings} from './flat/orient.js';\nimport {quantizeArray} from './flat/simplify.js';\n\n/**\n * @classdesc\n * Polygon geometry.\n *\n * @api\n */\nclass Polygon extends SimpleGeometry {\n /**\n * @param {!Array>|!Array} coordinates\n * Array of linear rings that define the polygon. The first linear ring of the\n * array defines the outer-boundary or surface of the polygon. Each subsequent\n * linear ring defines a hole in the surface of the polygon. A linear ring is\n * an array of vertices' coordinates where the first coordinate and the last are\n * equivalent. (For internal use, flat coordinates in combination with\n * `layout` and `ends` are also accepted.)\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @param {Array} [ends] Ends (for internal use with flat coordinates).\n */\n constructor(coordinates, layout, ends) {\n super();\n\n /**\n * @type {Array}\n * @private\n */\n this.ends_ = [];\n\n /**\n * @private\n * @type {number}\n */\n this.flatInteriorPointRevision_ = -1;\n\n /**\n * @private\n * @type {import(\"../coordinate.js\").Coordinate|null}\n */\n this.flatInteriorPoint_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.maxDelta_ = -1;\n\n /**\n * @private\n * @type {number}\n */\n this.maxDeltaRevision_ = -1;\n\n /**\n * @private\n * @type {number}\n */\n this.orientedRevision_ = -1;\n\n /**\n * @private\n * @type {Array|null}\n */\n this.orientedFlatCoordinates_ = null;\n\n if (layout !== undefined && ends) {\n this.setFlatCoordinates(\n layout,\n /** @type {Array} */ (coordinates),\n );\n this.ends_ = ends;\n } else {\n this.setCoordinates(\n /** @type {Array>} */ (\n coordinates\n ),\n layout,\n );\n }\n }\n\n /**\n * Append the passed linear ring to this polygon.\n * @param {LinearRing} linearRing Linear ring.\n * @api\n */\n appendLinearRing(linearRing) {\n if (!this.flatCoordinates) {\n this.flatCoordinates = linearRing.getFlatCoordinates().slice();\n } else {\n extend(this.flatCoordinates, linearRing.getFlatCoordinates());\n }\n this.ends_.push(this.flatCoordinates.length);\n this.changed();\n }\n\n /**\n * Make a complete copy of the geometry.\n * @return {!Polygon} Clone.\n * @api\n * @override\n */\n clone() {\n const polygon = new Polygon(\n this.flatCoordinates.slice(),\n this.layout,\n this.ends_.slice(),\n );\n polygon.applyProperties(this);\n return polygon;\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../coordinate.js\").Coordinate} closestPoint Closest point.\n * @param {number} minSquaredDistance Minimum squared distance.\n * @return {number} Minimum squared distance.\n * @override\n */\n closestPointXY(x, y, closestPoint, minSquaredDistance) {\n if (minSquaredDistance < closestSquaredDistanceXY(this.getExtent(), x, y)) {\n return minSquaredDistance;\n }\n if (this.maxDeltaRevision_ != this.getRevision()) {\n this.maxDelta_ = Math.sqrt(\n arrayMaxSquaredDelta(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n 0,\n ),\n );\n this.maxDeltaRevision_ = this.getRevision();\n }\n return assignClosestArrayPoint(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n this.maxDelta_,\n true,\n x,\n y,\n closestPoint,\n minSquaredDistance,\n );\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n * @return {boolean} Contains (x, y).\n * @override\n */\n containsXY(x, y) {\n return linearRingsContainsXY(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n x,\n y,\n );\n }\n\n /**\n * Return the area of the polygon on projected plane.\n * @return {number} Area (on projected plane).\n * @api\n */\n getArea() {\n return linearRingsArea(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n );\n }\n\n /**\n * Get the coordinate array for this geometry. This array has the structure\n * of a GeoJSON coordinate array for polygons.\n *\n * @param {boolean} [right] Orient coordinates according to the right-hand\n * rule (counter-clockwise for exterior and clockwise for interior rings).\n * If `false`, coordinates will be oriented according to the left-hand rule\n * (clockwise for exterior and counter-clockwise for interior rings).\n * By default, coordinate orientation will depend on how the geometry was\n * constructed.\n * @return {Array>} Coordinates.\n * @api\n * @override\n */\n getCoordinates(right) {\n let flatCoordinates;\n if (right !== undefined) {\n flatCoordinates = this.getOrientedFlatCoordinates().slice();\n orientLinearRings(flatCoordinates, 0, this.ends_, this.stride, right);\n } else {\n flatCoordinates = this.flatCoordinates;\n }\n\n return inflateCoordinatesArray(flatCoordinates, 0, this.ends_, this.stride);\n }\n\n /**\n * @return {Array} Ends.\n */\n getEnds() {\n return this.ends_;\n }\n\n /**\n * @return {Array} Interior point.\n */\n getFlatInteriorPoint() {\n if (this.flatInteriorPointRevision_ != this.getRevision()) {\n const flatCenter = getCenter(this.getExtent());\n this.flatInteriorPoint_ = getInteriorPointOfArray(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n flatCenter,\n 0,\n );\n this.flatInteriorPointRevision_ = this.getRevision();\n }\n return /** @type {import(\"../coordinate.js\").Coordinate} */ (\n this.flatInteriorPoint_\n );\n }\n\n /**\n * Return an interior point of the polygon.\n * @return {Point} Interior point as XYM coordinate, where M is the\n * length of the horizontal intersection that the point belongs to.\n * @api\n */\n getInteriorPoint() {\n return new Point(this.getFlatInteriorPoint(), 'XYM');\n }\n\n /**\n * Return the number of rings of the polygon, this includes the exterior\n * ring and any interior rings.\n *\n * @return {number} Number of rings.\n * @api\n */\n getLinearRingCount() {\n return this.ends_.length;\n }\n\n /**\n * Return the Nth linear ring of the polygon geometry. Return `null` if the\n * given index is out of range.\n * The exterior linear ring is available at index `0` and the interior rings\n * at index `1` and beyond.\n *\n * @param {number} index Index.\n * @return {LinearRing|null} Linear ring.\n * @api\n */\n getLinearRing(index) {\n if (index < 0 || this.ends_.length <= index) {\n return null;\n }\n return new LinearRing(\n this.flatCoordinates.slice(\n index === 0 ? 0 : this.ends_[index - 1],\n this.ends_[index],\n ),\n this.layout,\n );\n }\n\n /**\n * Return the linear rings of the polygon.\n * @return {Array} Linear rings.\n * @api\n */\n getLinearRings() {\n const layout = this.layout;\n const flatCoordinates = this.flatCoordinates;\n const ends = this.ends_;\n const linearRings = [];\n let offset = 0;\n for (let i = 0, ii = ends.length; i < ii; ++i) {\n const end = ends[i];\n const linearRing = new LinearRing(\n flatCoordinates.slice(offset, end),\n layout,\n );\n linearRings.push(linearRing);\n offset = end;\n }\n return linearRings;\n }\n\n /**\n * @return {Array} Oriented flat coordinates.\n */\n getOrientedFlatCoordinates() {\n if (this.orientedRevision_ != this.getRevision()) {\n const flatCoordinates = this.flatCoordinates;\n if (linearRingsAreOriented(flatCoordinates, 0, this.ends_, this.stride)) {\n this.orientedFlatCoordinates_ = flatCoordinates;\n } else {\n this.orientedFlatCoordinates_ = flatCoordinates.slice();\n this.orientedFlatCoordinates_.length = orientLinearRings(\n this.orientedFlatCoordinates_,\n 0,\n this.ends_,\n this.stride,\n );\n }\n this.orientedRevision_ = this.getRevision();\n }\n return /** @type {Array} */ (this.orientedFlatCoordinates_);\n }\n\n /**\n * @param {number} squaredTolerance Squared tolerance.\n * @return {Polygon} Simplified Polygon.\n * @protected\n * @override\n */\n getSimplifiedGeometryInternal(squaredTolerance) {\n /** @type {Array} */\n const simplifiedFlatCoordinates = [];\n /** @type {Array} */\n const simplifiedEnds = [];\n simplifiedFlatCoordinates.length = quantizeArray(\n this.flatCoordinates,\n 0,\n this.ends_,\n this.stride,\n Math.sqrt(squaredTolerance),\n simplifiedFlatCoordinates,\n 0,\n simplifiedEnds,\n );\n return new Polygon(simplifiedFlatCoordinates, 'XY', simplifiedEnds);\n }\n\n /**\n * Get the type of this geometry.\n * @return {import(\"./Geometry.js\").Type} Geometry type.\n * @api\n * @override\n */\n getType() {\n return 'Polygon';\n }\n\n /**\n * Test if the geometry and the passed extent intersect.\n * @param {import(\"../extent.js\").Extent} extent Extent.\n * @return {boolean} `true` if the geometry and the extent intersect.\n * @api\n * @override\n */\n intersectsExtent(extent) {\n return intersectsLinearRingArray(\n this.getOrientedFlatCoordinates(),\n 0,\n this.ends_,\n this.stride,\n extent,\n );\n }\n\n /**\n * Set the coordinates of the polygon.\n * @param {!Array>} coordinates Coordinates.\n * @param {import(\"./Geometry.js\").GeometryLayout} [layout] Layout.\n * @api\n * @override\n */\n setCoordinates(coordinates, layout) {\n this.setLayout(layout, coordinates, 2);\n if (!this.flatCoordinates) {\n this.flatCoordinates = [];\n }\n const ends = deflateCoordinatesArray(\n this.flatCoordinates,\n 0,\n coordinates,\n this.stride,\n this.ends_,\n );\n this.flatCoordinates.length = ends.length === 0 ? 0 : ends[ends.length - 1];\n this.changed();\n }\n}\n\nexport default Polygon;\n\n/**\n * Create an approximation of a circle on the surface of a sphere.\n * @param {import(\"../coordinate.js\").Coordinate} center Center (`[lon, lat]` in degrees).\n * @param {number} radius The great-circle distance from the center to\n * the polygon vertices in meters.\n * @param {number} [n] Optional number of vertices for the resulting\n * polygon. Default is `32`.\n * @param {number} [sphereRadius] Optional radius for the sphere (defaults to\n * the Earth's mean radius using the WGS84 ellipsoid).\n * @return {Polygon} The \"circular\" polygon.\n * @api\n */\nexport function circular(center, radius, n, sphereRadius) {\n n = n ? n : 32;\n /** @type {Array} */\n const flatCoordinates = [];\n for (let i = 0; i < n; ++i) {\n extend(\n flatCoordinates,\n sphereOffset(center, radius, (2 * Math.PI * i) / n, sphereRadius),\n );\n }\n flatCoordinates.push(flatCoordinates[0], flatCoordinates[1]);\n return new Polygon(flatCoordinates, 'XY', [flatCoordinates.length]);\n}\n\n/**\n * Create a polygon from an extent. The layout used is `XY`.\n * @param {import(\"../extent.js\").Extent} extent The extent.\n * @return {Polygon} The polygon.\n * @api\n */\nexport function fromExtent(extent) {\n if (isEmpty(extent)) {\n throw new Error('Cannot create polygon from empty extent');\n }\n const minX = extent[0];\n const minY = extent[1];\n const maxX = extent[2];\n const maxY = extent[3];\n const flatCoordinates = [\n minX,\n minY,\n minX,\n maxY,\n maxX,\n maxY,\n maxX,\n minY,\n minX,\n minY,\n ];\n return new Polygon(flatCoordinates, 'XY', [flatCoordinates.length]);\n}\n\n/**\n * Create a regular polygon from a circle.\n * @param {import(\"./Circle.js\").default} circle Circle geometry.\n * @param {number} [sides] Number of sides of the polygon. Default is 32.\n * @param {number} [angle] Start angle for the first vertex of the polygon in\n * counter-clockwise radians. 0 means East. Default is 0.\n * @return {Polygon} Polygon geometry.\n * @api\n */\nexport function fromCircle(circle, sides, angle) {\n sides = sides ? sides : 32;\n const stride = circle.getStride();\n const layout = circle.getLayout();\n const center = circle.getCenter();\n const arrayLength = stride * (sides + 1);\n const flatCoordinates = new Array(arrayLength);\n for (let i = 0; i < arrayLength; i += stride) {\n flatCoordinates[i] = 0;\n flatCoordinates[i + 1] = 0;\n for (let j = 2; j < stride; j++) {\n flatCoordinates[i + j] = center[j];\n }\n }\n const ends = [flatCoordinates.length];\n const polygon = new Polygon(flatCoordinates, layout, ends);\n makeRegular(polygon, center, circle.getRadius(), angle);\n return polygon;\n}\n\n/**\n * Modify the coordinates of a polygon to make it a regular polygon.\n * @param {Polygon} polygon Polygon geometry.\n * @param {import(\"../coordinate.js\").Coordinate} center Center of the regular polygon.\n * @param {number} radius Radius of the regular polygon.\n * @param {number} [angle] Start angle for the first vertex of the polygon in\n * counter-clockwise radians. 0 means East. Default is 0.\n */\nexport function makeRegular(polygon, center, radius, angle) {\n const flatCoordinates = polygon.getFlatCoordinates();\n const stride = polygon.getStride();\n const sides = flatCoordinates.length / stride - 1;\n const startAngle = angle ? angle : 0;\n for (let i = 0; i <= sides; ++i) {\n const offset = i * stride;\n const angle = startAngle + (modulo(i, sides) * 2 * Math.PI) / sides;\n flatCoordinates[offset] = center[0] + radius * Math.cos(angle);\n flatCoordinates[offset + 1] = center[1] + radius * Math.sin(angle);\n }\n polygon.changed();\n}\n","/**\n * @module ol/resolutionconstraint\n */\nimport {linearFindNearest} from './array.js';\nimport {getHeight, getWidth} from './extent.js';\nimport {clamp} from './math.js';\n\n/**\n * @typedef {function((number|undefined), number, import(\"./size.js\").Size, boolean=): (number|undefined)} Type\n */\n\n/**\n * Returns a modified resolution taking into account the viewport size and maximum\n * allowed extent.\n * @param {number} resolution Resolution\n * @param {import(\"./extent.js\").Extent} maxExtent Maximum allowed extent.\n * @param {import(\"./size.js\").Size} viewportSize Viewport size.\n * @param {boolean} showFullExtent Whether to show the full extent.\n * @return {number} Capped resolution.\n */\nfunction getViewportClampedResolution(\n resolution,\n maxExtent,\n viewportSize,\n showFullExtent,\n) {\n const xResolution = getWidth(maxExtent) / viewportSize[0];\n const yResolution = getHeight(maxExtent) / viewportSize[1];\n\n if (showFullExtent) {\n return Math.min(resolution, Math.max(xResolution, yResolution));\n }\n return Math.min(resolution, Math.min(xResolution, yResolution));\n}\n\n/**\n * Returns a modified resolution to be between maxResolution and minResolution while\n * still allowing the value to be slightly out of bounds.\n * Note: the computation is based on the logarithm function (ln):\n * - at 1, ln(x) is 0\n * - above 1, ln(x) keeps increasing but at a much slower pace than x\n * The final result is clamped to prevent getting too far away from bounds.\n * @param {number} resolution Resolution.\n * @param {number} maxResolution Max resolution.\n * @param {number} minResolution Min resolution.\n * @return {number} Smoothed resolution.\n */\nfunction getSmoothClampedResolution(resolution, maxResolution, minResolution) {\n let result = Math.min(resolution, maxResolution);\n const ratio = 50;\n\n result *=\n Math.log(1 + ratio * Math.max(0, resolution / maxResolution - 1)) / ratio +\n 1;\n if (minResolution) {\n result = Math.max(result, minResolution);\n result /=\n Math.log(1 + ratio * Math.max(0, minResolution / resolution - 1)) /\n ratio +\n 1;\n }\n return clamp(result, minResolution / 2, maxResolution * 2);\n}\n\n/**\n * @param {Array} resolutions Resolutions.\n * @param {boolean} [smooth] If true, the view will be able to slightly exceed resolution limits. Default: true.\n * @param {import(\"./extent.js\").Extent} [maxExtent] Maximum allowed extent.\n * @param {boolean} [showFullExtent] If true, allows us to show the full extent. Default: false.\n * @return {Type} Zoom function.\n */\nexport function createSnapToResolutions(\n resolutions,\n smooth,\n maxExtent,\n showFullExtent,\n) {\n smooth = smooth !== undefined ? smooth : true;\n return (\n /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function (resolution, direction, size, isMoving) {\n if (resolution !== undefined) {\n const maxResolution = resolutions[0];\n const minResolution = resolutions[resolutions.length - 1];\n const cappedMaxRes = maxExtent\n ? getViewportClampedResolution(\n maxResolution,\n maxExtent,\n size,\n showFullExtent,\n )\n : maxResolution;\n\n // during interacting or animating, allow intermediary values\n if (isMoving) {\n if (!smooth) {\n return clamp(resolution, minResolution, cappedMaxRes);\n }\n return getSmoothClampedResolution(\n resolution,\n cappedMaxRes,\n minResolution,\n );\n }\n\n const capped = Math.min(cappedMaxRes, resolution);\n const z = Math.floor(linearFindNearest(resolutions, capped, direction));\n if (resolutions[z] > cappedMaxRes && z < resolutions.length - 1) {\n return resolutions[z + 1];\n }\n return resolutions[z];\n }\n return undefined;\n }\n );\n}\n\n/**\n * @param {number} power Power.\n * @param {number} maxResolution Maximum resolution.\n * @param {number} [minResolution] Minimum resolution.\n * @param {boolean} [smooth] If true, the view will be able to slightly exceed resolution limits. Default: true.\n * @param {import(\"./extent.js\").Extent} [maxExtent] Maximum allowed extent.\n * @param {boolean} [showFullExtent] If true, allows us to show the full extent. Default: false.\n * @return {Type} Zoom function.\n */\nexport function createSnapToPower(\n power,\n maxResolution,\n minResolution,\n smooth,\n maxExtent,\n showFullExtent,\n) {\n smooth = smooth !== undefined ? smooth : true;\n minResolution = minResolution !== undefined ? minResolution : 0;\n\n return (\n /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function (resolution, direction, size, isMoving) {\n if (resolution !== undefined) {\n const cappedMaxRes = maxExtent\n ? getViewportClampedResolution(\n maxResolution,\n maxExtent,\n size,\n showFullExtent,\n )\n : maxResolution;\n\n // during interacting or animating, allow intermediary values\n if (isMoving) {\n if (!smooth) {\n return clamp(resolution, minResolution, cappedMaxRes);\n }\n return getSmoothClampedResolution(\n resolution,\n cappedMaxRes,\n minResolution,\n );\n }\n\n const tolerance = 1e-9;\n const minZoomLevel = Math.ceil(\n Math.log(maxResolution / cappedMaxRes) / Math.log(power) - tolerance,\n );\n const offset = -direction * (0.5 - tolerance) + 0.5;\n const capped = Math.min(cappedMaxRes, resolution);\n const cappedZoomLevel = Math.floor(\n Math.log(maxResolution / capped) / Math.log(power) + offset,\n );\n const zoomLevel = Math.max(minZoomLevel, cappedZoomLevel);\n const newResolution = maxResolution / Math.pow(power, zoomLevel);\n return clamp(newResolution, minResolution, cappedMaxRes);\n }\n return undefined;\n }\n );\n}\n\n/**\n * @param {number} maxResolution Max resolution.\n * @param {number} minResolution Min resolution.\n * @param {boolean} [smooth] If true, the view will be able to slightly exceed resolution limits. Default: true.\n * @param {import(\"./extent.js\").Extent} [maxExtent] Maximum allowed extent.\n * @param {boolean} [showFullExtent] If true, allows us to show the full extent. Default: false.\n * @return {Type} Zoom function.\n */\nexport function createMinMaxResolution(\n maxResolution,\n minResolution,\n smooth,\n maxExtent,\n showFullExtent,\n) {\n smooth = smooth !== undefined ? smooth : true;\n\n return (\n /**\n * @param {number|undefined} resolution Resolution.\n * @param {number} direction Direction.\n * @param {import(\"./size.js\").Size} size Viewport size.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Resolution.\n */\n function (resolution, direction, size, isMoving) {\n if (resolution !== undefined) {\n const cappedMaxRes = maxExtent\n ? getViewportClampedResolution(\n maxResolution,\n maxExtent,\n size,\n showFullExtent,\n )\n : maxResolution;\n\n if (!smooth || !isMoving) {\n return clamp(resolution, minResolution, cappedMaxRes);\n }\n return getSmoothClampedResolution(\n resolution,\n cappedMaxRes,\n minResolution,\n );\n }\n return undefined;\n }\n );\n}\n","/**\n * @module ol/rotationconstraint\n */\nimport {toRadians} from './math.js';\n\n/**\n * @typedef {function((number|undefined), boolean=): (number|undefined)} Type\n */\n\n/**\n * @param {number|undefined} rotation Rotation.\n * @return {number|undefined} Rotation.\n */\nexport function disable(rotation) {\n if (rotation !== undefined) {\n return 0;\n }\n return undefined;\n}\n\n/**\n * @param {number|undefined} rotation Rotation.\n * @return {number|undefined} Rotation.\n */\nexport function none(rotation) {\n if (rotation !== undefined) {\n return rotation;\n }\n return undefined;\n}\n\n/**\n * @param {number} n N.\n * @return {Type} Rotation constraint.\n */\nexport function createSnapToN(n) {\n const theta = (2 * Math.PI) / n;\n return (\n /**\n * @param {number|undefined} rotation Rotation.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Rotation.\n */\n function (rotation, isMoving) {\n if (isMoving) {\n return rotation;\n }\n\n if (rotation !== undefined) {\n rotation = Math.floor(rotation / theta + 0.5) * theta;\n return rotation;\n }\n return undefined;\n }\n );\n}\n\n/**\n * @param {number} [tolerance] Tolerance.\n * @return {Type} Rotation constraint.\n */\nexport function createSnapToZero(tolerance) {\n const t = tolerance === undefined ? toRadians(5) : tolerance;\n return (\n /**\n * @param {number|undefined} rotation Rotation.\n * @param {boolean} [isMoving] True if an interaction or animation is in progress.\n * @return {number|undefined} Rotation.\n */\n function (rotation, isMoving) {\n if (isMoving || rotation === undefined) {\n return rotation;\n }\n\n if (Math.abs(rotation) <= t) {\n return 0;\n }\n return rotation;\n }\n );\n}\n","/**\n * @module ol/View\n */\nimport BaseObject from './Object.js';\nimport ViewHint from './ViewHint.js';\nimport ViewProperty from './ViewProperty.js';\nimport {linearFindNearest} from './array.js';\nimport {assert} from './asserts.js';\nimport {none as centerNone, createExtent} from './centerconstraint.js';\nimport {\n add as addCoordinate,\n equals as coordinatesEqual,\n equals,\n rotate as rotateCoordinate,\n} from './coordinate.js';\nimport {easeOut, inAndOut} from './easing.js';\nimport {\n getCenter,\n getForViewAndSize,\n getHeight,\n getWidth,\n isEmpty,\n} from './extent.js';\nimport {VOID} from './functions.js';\nimport {fromExtent as polygonFromExtent} from './geom/Polygon.js';\nimport {clamp, modulo} from './math.js';\nimport {\n METERS_PER_UNIT,\n createProjection,\n disableCoordinateWarning,\n fromUserCoordinate,\n fromUserExtent,\n getUserProjection,\n toUserCoordinate,\n toUserExtent,\n} from './proj.js';\nimport {\n createMinMaxResolution,\n createSnapToPower,\n createSnapToResolutions,\n} from './resolutionconstraint.js';\nimport {\n createSnapToN,\n createSnapToZero,\n disable,\n none as rotationNone,\n} from './rotationconstraint.js';\nimport {DEFAULT_TILE_SIZE} from './tilegrid/common.js';\n\n/**\n * An animation configuration\n *\n * @typedef {Object} Animation\n * @property {import(\"./coordinate.js\").Coordinate} [sourceCenter] Source center.\n * @property {import(\"./coordinate.js\").Coordinate} [targetCenter] Target center.\n * @property {number} [sourceResolution] Source resolution.\n * @property {number} [targetResolution] Target resolution.\n * @property {number} [sourceRotation] Source rotation.\n * @property {number} [targetRotation] Target rotation.\n * @property {import(\"./coordinate.js\").Coordinate} [anchor] Anchor.\n * @property {number} start Start.\n * @property {number} duration Duration.\n * @property {boolean} complete Complete.\n * @property {function(number):number} easing Easing.\n * @property {function(boolean):void} callback Callback.\n */\n\n/**\n * @typedef {Object} Constraints\n * @property {import(\"./centerconstraint.js\").Type} center Center.\n * @property {import(\"./resolutionconstraint.js\").Type} resolution Resolution.\n * @property {import(\"./rotationconstraint.js\").Type} rotation Rotation.\n */\n\n/**\n * @typedef {Object} FitOptions\n * @property {import(\"./size.js\").Size} [size] The size in pixels of the box to\n * fit the extent into. Defaults to the size of the map the view is associated with.\n * If no map or multiple maps are connected to the view, provide the desired box size\n * (e.g. `map.getSize()`).\n * @property {!Array} [padding=[0, 0, 0, 0]] Padding (in pixels) to be\n * cleared inside the view. Values in the array are top, right, bottom and left\n * padding.\n * @property {boolean} [nearest=false] If the view `constrainResolution` option is `true`,\n * get the nearest extent instead of the closest that actually fits the view.\n * @property {number} [minResolution=0] Minimum resolution that we zoom to.\n * @property {number} [maxZoom] Maximum zoom level that we zoom to. If\n * `minResolution` is given, this property is ignored.\n * @property {number} [duration] The duration of the animation in milliseconds.\n * By default, there is no animation to the target extent.\n * @property {function(number):number} [easing] The easing function used during\n * the animation (defaults to {@link module:ol/easing.inAndOut}).\n * The function will be called for each frame with a number representing a\n * fraction of the animation's duration. The function should return a number\n * between 0 and 1 representing the progress toward the destination state.\n * @property {function(boolean):void} [callback] Function called when the view is in\n * its final position. The callback will be called with `true` if the animation\n * series completed on its own or `false` if it was cancelled.\n */\n\n/**\n * @typedef {Object} ViewOptions\n * @property {import(\"./coordinate.js\").Coordinate} [center] The initial center for\n * the view. If a user projection is not set, the coordinate system for the center is\n * specified with the `projection` option. Layer sources will not be fetched if this\n * is not set, but the center can be set later with {@link #setCenter}.\n * @property {boolean|number} [constrainRotation=true] Rotation constraint.\n * `false` means no constraint. `true` means no constraint, but snap to zero\n * near zero. A number constrains the rotation to that number of values. For\n * example, `4` will constrain the rotation to 0, 90, 180, and 270 degrees.\n * @property {boolean} [enableRotation=true] Enable rotation.\n * If `false`, a rotation constraint that always sets the rotation to zero is\n * used. The `constrainRotation` option has no effect if `enableRotation` is\n * `false`.\n * @property {import(\"./extent.js\").Extent} [extent] The extent that constrains the\n * view, in other words, nothing outside of this extent can be visible on the map.\n * @property {boolean} [constrainOnlyCenter=false] If true, the extent\n * constraint will only apply to the view center and not the whole extent.\n * @property {boolean} [smoothExtentConstraint=true] If true, the extent\n * constraint will be applied smoothly, i.e. allow the view to go slightly outside\n * of the given `extent`.\n * @property {number} [maxResolution] The maximum resolution used to determine\n * the resolution constraint. It is used together with `minResolution` (or\n * `maxZoom`) and `zoomFactor`. If unspecified it is calculated in such a way\n * that the projection's validity extent fits in a 256x256 px tile. If the\n * projection is Spherical Mercator (the default) then `maxResolution` defaults\n * to `40075016.68557849 / 256 = 156543.03392804097`.\n * @property {number} [minResolution] The minimum resolution used to determine\n * the resolution constraint. It is used together with `maxResolution` (or\n * `minZoom`) and `zoomFactor`. If unspecified it is calculated assuming 29\n * zoom levels (with a factor of 2). If the projection is Spherical Mercator\n * (the default) then `minResolution` defaults to\n * `40075016.68557849 / 256 / Math.pow(2, 28) = 0.0005831682455839253`.\n * @property {number} [maxZoom=28] The maximum zoom level used to determine the\n * resolution constraint. It is used together with `minZoom` (or\n * `maxResolution`) and `zoomFactor`. Note that if `minResolution` is also\n * provided, it is given precedence over `maxZoom`.\n * @property {number} [minZoom=0] The minimum zoom level used to determine the\n * resolution constraint. It is used together with `maxZoom` (or\n * `minResolution`) and `zoomFactor`. Note that if `maxResolution` is also\n * provided, it is given precedence over `minZoom`.\n * @property {boolean} [multiWorld=false] If `false` the view is constrained so\n * only one world is visible, and you cannot pan off the edge. If `true` the map\n * may show multiple worlds at low zoom levels. Only used if the `projection` is\n * global. Note that if `extent` is also provided it is given precedence.\n * @property {boolean} [constrainResolution=false] If true, the view will always\n * animate to the closest zoom level after an interaction; false means\n * intermediary zoom levels are allowed.\n * @property {boolean} [smoothResolutionConstraint=true] If true, the resolution\n * min/max values will be applied smoothly, i. e. allow the view to exceed slightly\n * the given resolution or zoom bounds.\n * @property {boolean} [showFullExtent=false] Allow the view to be zoomed out to\n * show the full configured extent. By default, when a view is configured with an\n * extent, users will not be able to zoom out so the viewport exceeds the extent in\n * either dimension. This means the full extent may not be visible if the viewport\n * is taller or wider than the aspect ratio of the configured extent. If\n * showFullExtent is true, the user will be able to zoom out so that the viewport\n * exceeds the height or width of the configured extent, but not both, allowing the\n * full extent to be shown.\n * @property {import(\"./proj.js\").ProjectionLike} [projection='EPSG:3857'] The\n * projection. The default is Spherical Mercator.\n * @property {number} [resolution] The initial resolution for the view. The\n * units are `projection` units per pixel (e.g. meters per pixel). An\n * alternative to setting this is to set `zoom`. Layer sources will not be\n * fetched if neither this nor `zoom` are defined, but they can be set later\n * with {@link #setZoom} or {@link #setResolution}.\n * @property {Array} [resolutions] Resolutions that determine the\n * zoom levels if specified. The index in the array corresponds to the zoom level,\n * therefore the resolution values have to be in descending order. It also constrains\n * the resolution by the minimum and maximum value. If set the `maxResolution`,\n * `minResolution`, `minZoom`, `maxZoom`, and `zoomFactor` options are ignored.\n * @property {number} [rotation=0] The initial rotation for the view in radians\n * (positive rotation clockwise, 0 means North).\n * @property {number} [zoom] Only used if `resolution` is not defined. Zoom\n * level used to calculate the initial resolution for the view.\n * @property {number} [zoomFactor=2] The zoom factor used to compute the\n * corresponding resolution.\n * @property {!Array} [padding=[0, 0, 0, 0]] Padding (in css pixels).\n * If the map viewport is partially covered with other content (overlays) along\n * its edges, this setting allows to shift the center of the viewport away from\n * that content. The order of the values is top, right, bottom, left.\n */\n\n/**\n * @typedef {Object} AnimationOptions\n * @property {import(\"./coordinate.js\").Coordinate} [center] The center of the view at the end of\n * the animation.\n * @property {number} [zoom] The zoom level of the view at the end of the\n * animation. This takes precedence over `resolution`.\n * @property {number} [resolution] The resolution of the view at the end\n * of the animation. If `zoom` is also provided, this option will be ignored.\n * @property {number} [rotation] The rotation of the view at the end of\n * the animation.\n * @property {import(\"./coordinate.js\").Coordinate} [anchor] Optional anchor to remain fixed\n * during a rotation or resolution animation.\n * @property {number} [duration=1000] The duration of the animation in milliseconds.\n * @property {function(number):number} [easing] The easing function used\n * during the animation (defaults to {@link module:ol/easing.inAndOut}).\n * The function will be called for each frame with a number representing a\n * fraction of the animation's duration. The function should return a number\n * between 0 and 1 representing the progress toward the destination state.\n */\n\n/**\n * @typedef {Object} State\n * @property {import(\"./coordinate.js\").Coordinate} center Center (in view projection coordinates).\n * @property {import(\"./proj/Projection.js\").default} projection Projection.\n * @property {number} resolution Resolution.\n * @property {import(\"./coordinate.js\").Coordinate} [nextCenter] The next center during an animation series.\n * @property {number} [nextResolution] The next resolution during an animation series.\n * @property {number} [nextRotation] The next rotation during an animation series.\n * @property {number} rotation Rotation.\n * @property {number} zoom Zoom.\n */\n\n/**\n * Like {@link import(\"./Map.js\").FrameState}, but just `viewState` and `extent`.\n * @typedef {Object} ViewStateLayerStateExtent\n * @property {State} viewState View state.\n * @property {import(\"./extent.js\").Extent} extent Extent (in user projection coordinates).\n * @property {Array} [layerStatesArray] Layer states.\n */\n\n/**\n * Default min zoom level for the map view.\n * @type {number}\n */\nconst DEFAULT_MIN_ZOOM = 0;\n\n/**\n * @typedef {import(\"./ObjectEventType.js\").Types|'change:center'|'change:resolution'|'change:rotation'} ViewObjectEventTypes\n */\n\n/***\n * @template Return\n * @typedef {import(\"./Observable.js\").OnSignature &\n * import(\"./Observable.js\").OnSignature &\n * import(\"./Observable.js\").CombinedOnSignature} ViewOnSignature\n */\n\n/**\n * @classdesc\n * A View object represents a simple 2D view of the map.\n *\n * This is the object to act upon to change the center, resolution,\n * and rotation of the map.\n *\n * A View has a `projection`. The projection determines the\n * coordinate system of the center, and its units determine the units of the\n * resolution (projection units per pixel). The default projection is\n * Web Mercator (EPSG:3857).\n *\n * ### The view states\n *\n * A View is determined by three states: `center`, `resolution`,\n * and `rotation`. Each state has a corresponding getter and setter, e.g.\n * `getCenter` and `setCenter` for the `center` state.\n *\n * The `zoom` state is actually not saved on the view: all computations\n * internally use the `resolution` state. Still, the `setZoom` and `getZoom`\n * methods are available, as well as `getResolutionForZoom` and\n * `getZoomForResolution` to switch from one system to the other.\n *\n * ### The constraints\n *\n * `setCenter`, `setResolution` and `setRotation` can be used to change the\n * states of the view, but any constraint defined in the constructor will\n * be applied along the way.\n *\n * A View object can have a *resolution constraint*, a *rotation constraint*\n * and a *center constraint*.\n *\n * The *resolution constraint* typically restricts min/max values and\n * snaps to specific resolutions. It is determined by the following\n * options: `resolutions`, `maxResolution`, `maxZoom` and `zoomFactor`.\n * If `resolutions` is set, the other three options are ignored. See\n * documentation for each option for more information. By default, the view\n * only has a min/max restriction and allow intermediary zoom levels when\n * pinch-zooming for example.\n *\n * The *rotation constraint* snaps to specific angles. It is determined\n * by the following options: `enableRotation` and `constrainRotation`.\n * By default rotation is allowed and its value is snapped to zero when approaching the\n * horizontal.\n *\n * The *center constraint* is determined by the `extent` option. By\n * default the view center is not constrained at all.\n *\n * ### Changing the view state\n *\n * It is important to note that `setZoom`, `setResolution`, `setCenter` and\n * `setRotation` are subject to the above mentioned constraints. As such, it\n * may sometimes not be possible to know in advance the resulting state of the\n * View. For example, calling `setResolution(10)` does not guarantee that\n * `getResolution()` will return `10`.\n *\n * A consequence of this is that, when applying a delta on the view state, one\n * should use `adjustCenter`, `adjustRotation`, `adjustZoom` and `adjustResolution`\n * rather than the corresponding setters. This will let view do its internal\n * computations. Besides, the `adjust*` methods also take an `anchor`\n * argument which allows specifying an origin for the transformation.\n *\n * ### Interacting with the view\n *\n * View constraints are usually only applied when the view is *at rest*, meaning that\n * no interaction or animation is ongoing. As such, if the user puts the view in a\n * state that is not equivalent to a constrained one (e.g. rotating the view when\n * the snap angle is 0), an animation will be triggered at the interaction end to\n * put back the view to a stable state;\n *\n * @api\n * @extends {BaseObject}\n */\nclass View extends BaseObject {\n /**\n * @param {ViewOptions} [options] View options.\n */\n constructor(options) {\n super();\n\n /***\n * @type {ViewOnSignature}\n */\n this.on;\n\n /***\n * @type {ViewOnSignature}\n */\n this.once;\n\n /***\n * @type {ViewOnSignature}\n */\n this.un;\n\n options = Object.assign({}, options);\n\n /**\n * @private\n * @type {Array}\n */\n this.hints_ = [0, 0];\n\n /**\n * @private\n * @type {Array>}\n */\n this.animations_ = [];\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.updateAnimationKey_;\n\n /**\n * @private\n * @const\n * @type {import(\"./proj/Projection.js\").default}\n */\n this.projection_ = createProjection(options.projection, 'EPSG:3857');\n\n /**\n * @private\n * @type {import(\"./size.js\").Size}\n */\n this.viewportSize_ = [100, 100];\n\n /**\n * @private\n * @type {import(\"./coordinate.js\").Coordinate|undefined}\n */\n this.targetCenter_ = null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.targetResolution_;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.targetRotation_;\n\n /**\n * @private\n * @type {import(\"./coordinate.js\").Coordinate}\n */\n this.nextCenter_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.nextResolution_;\n\n /**\n * @private\n * @type {number}\n */\n this.nextRotation_;\n\n /**\n * @private\n * @type {import(\"./coordinate.js\").Coordinate|undefined}\n */\n this.cancelAnchor_ = undefined;\n\n if (options.projection) {\n disableCoordinateWarning();\n }\n if (options.center) {\n options.center = fromUserCoordinate(options.center, this.projection_);\n }\n if (options.extent) {\n options.extent = fromUserExtent(options.extent, this.projection_);\n }\n\n this.applyOptions_(options);\n }\n\n /**\n * Set up the view with the given options.\n * @param {ViewOptions} options View options.\n */\n applyOptions_(options) {\n const properties = Object.assign({}, options);\n for (const key in ViewProperty) {\n delete properties[key];\n }\n this.setProperties(properties, true);\n\n const resolutionConstraintInfo = createResolutionConstraint(options);\n\n /**\n * @private\n * @type {number}\n */\n this.maxResolution_ = resolutionConstraintInfo.maxResolution;\n\n /**\n * @private\n * @type {number}\n */\n this.minResolution_ = resolutionConstraintInfo.minResolution;\n\n /**\n * @private\n * @type {number}\n */\n this.zoomFactor_ = resolutionConstraintInfo.zoomFactor;\n\n /**\n * @private\n * @type {Array|undefined}\n */\n this.resolutions_ = options.resolutions;\n\n /**\n * @type {Array|undefined}\n * @private\n */\n this.padding_ = options.padding;\n\n /**\n * @private\n * @type {number}\n */\n this.minZoom_ = resolutionConstraintInfo.minZoom;\n\n const centerConstraint = createCenterConstraint(options);\n const resolutionConstraint = resolutionConstraintInfo.constraint;\n const rotationConstraint = createRotationConstraint(options);\n\n /**\n * @private\n * @type {Constraints}\n */\n this.constraints_ = {\n center: centerConstraint,\n resolution: resolutionConstraint,\n rotation: rotationConstraint,\n };\n\n this.setRotation(options.rotation !== undefined ? options.rotation : 0);\n this.setCenterInternal(\n options.center !== undefined ? options.center : null,\n );\n if (options.resolution !== undefined) {\n this.setResolution(options.resolution);\n } else if (options.zoom !== undefined) {\n this.setZoom(options.zoom);\n }\n }\n\n /**\n * Padding (in css pixels).\n * If the map viewport is partially covered with other content (overlays) along\n * its edges, this setting allows to shift the center of the viewport away from that\n * content. The order of the values in the array is top, right, bottom, left.\n * The default is no padding, which is equivalent to `[0, 0, 0, 0]`.\n * @type {Array|undefined}\n * @api\n */\n get padding() {\n return this.padding_;\n }\n set padding(padding) {\n let oldPadding = this.padding_;\n this.padding_ = padding;\n const center = this.getCenterInternal();\n if (center) {\n const newPadding = padding || [0, 0, 0, 0];\n oldPadding = oldPadding || [0, 0, 0, 0];\n const resolution = this.getResolution();\n const offsetX =\n (resolution / 2) *\n (newPadding[3] - oldPadding[3] + oldPadding[1] - newPadding[1]);\n const offsetY =\n (resolution / 2) *\n (newPadding[0] - oldPadding[0] + oldPadding[2] - newPadding[2]);\n this.setCenterInternal([center[0] + offsetX, center[1] - offsetY]);\n }\n }\n\n /**\n * Get an updated version of the view options used to construct the view. The\n * current resolution (or zoom), center, and rotation are applied to any stored\n * options. The provided options can be used to apply new min/max zoom or\n * resolution limits.\n * @param {ViewOptions} newOptions New options to be applied.\n * @return {ViewOptions} New options updated with the current view state.\n */\n getUpdatedOptions_(newOptions) {\n const options = this.getProperties();\n\n // preserve resolution (or zoom)\n if (options.resolution !== undefined) {\n options.resolution = this.getResolution();\n } else {\n options.zoom = this.getZoom();\n }\n\n // preserve center\n options.center = this.getCenterInternal();\n\n // preserve rotation\n options.rotation = this.getRotation();\n\n return Object.assign({}, options, newOptions);\n }\n\n /**\n * Animate the view. The view's center, zoom (or resolution), and rotation\n * can be animated for smooth transitions between view states. For example,\n * to animate the view to a new zoom level:\n *\n * view.animate({zoom: view.getZoom() + 1});\n *\n * By default, the animation lasts one second and uses in-and-out easing. You\n * can customize this behavior by including `duration` (in milliseconds) and\n * `easing` options (see {@link module:ol/easing}).\n *\n * To chain together multiple animations, call the method with multiple\n * animation objects. For example, to first zoom and then pan:\n *\n * view.animate({zoom: 10}, {center: [0, 0]});\n *\n * If you provide a function as the last argument to the animate method, it\n * will get called at the end of an animation series. The callback will be\n * called with `true` if the animation series completed on its own or `false`\n * if it was cancelled.\n *\n * Animations are cancelled by user interactions (e.g. dragging the map) or by\n * calling `view.setCenter()`, `view.setResolution()`, or `view.setRotation()`\n * (or another method that calls one of these).\n *\n * @param {...(AnimationOptions|function(boolean): void)} var_args Animation\n * options. Multiple animations can be run in series by passing multiple\n * options objects. To run multiple animations in parallel, call the method\n * multiple times. An optional callback can be provided as a final\n * argument. The callback will be called with a boolean indicating whether\n * the animation completed without being cancelled.\n * @api\n */\n animate(var_args) {\n if (this.isDef() && !this.getAnimating()) {\n this.resolveConstraints(0);\n }\n const args = new Array(arguments.length);\n for (let i = 0; i < args.length; ++i) {\n let options = arguments[i];\n if (options.center) {\n options = Object.assign({}, options);\n options.center = fromUserCoordinate(\n options.center,\n this.getProjection(),\n );\n }\n if (options.anchor) {\n options = Object.assign({}, options);\n options.anchor = fromUserCoordinate(\n options.anchor,\n this.getProjection(),\n );\n }\n args[i] = options;\n }\n this.animateInternal.apply(this, args);\n }\n\n /**\n * @param {...(AnimationOptions|function(boolean): void)} var_args Animation options.\n */\n animateInternal(var_args) {\n let animationCount = arguments.length;\n let callback;\n if (\n animationCount > 1 &&\n typeof arguments[animationCount - 1] === 'function'\n ) {\n callback = arguments[animationCount - 1];\n --animationCount;\n }\n\n let i = 0;\n for (; i < animationCount && !this.isDef(); ++i) {\n // if view properties are not yet set, shortcut to the final state\n const state = arguments[i];\n if (state.center) {\n this.setCenterInternal(state.center);\n }\n if (state.zoom !== undefined) {\n this.setZoom(state.zoom);\n } else if (state.resolution) {\n this.setResolution(state.resolution);\n }\n if (state.rotation !== undefined) {\n this.setRotation(state.rotation);\n }\n }\n if (i === animationCount) {\n if (callback) {\n animationCallback(callback, true);\n }\n return;\n }\n\n let start = Date.now();\n let center = this.targetCenter_.slice();\n let resolution = this.targetResolution_;\n let rotation = this.targetRotation_;\n const series = [];\n for (; i < animationCount; ++i) {\n const options = /** @type {AnimationOptions} */ (arguments[i]);\n\n const animation = {\n start: start,\n complete: false,\n anchor: options.anchor,\n duration: options.duration !== undefined ? options.duration : 1000,\n easing: options.easing || inAndOut,\n callback: callback,\n };\n\n if (options.center) {\n animation.sourceCenter = center;\n animation.targetCenter = options.center.slice();\n center = animation.targetCenter;\n }\n\n if (options.zoom !== undefined) {\n animation.sourceResolution = resolution;\n animation.targetResolution = this.getResolutionForZoom(options.zoom);\n resolution = animation.targetResolution;\n } else if (options.resolution) {\n animation.sourceResolution = resolution;\n animation.targetResolution = options.resolution;\n resolution = animation.targetResolution;\n }\n\n if (options.rotation !== undefined) {\n animation.sourceRotation = rotation;\n const delta =\n modulo(options.rotation - rotation + Math.PI, 2 * Math.PI) - Math.PI;\n animation.targetRotation = rotation + delta;\n rotation = animation.targetRotation;\n }\n\n // check if animation is a no-op\n if (isNoopAnimation(animation)) {\n animation.complete = true;\n // we still push it onto the series for callback handling\n } else {\n start += animation.duration;\n }\n series.push(animation);\n }\n this.animations_.push(series);\n this.setHint(ViewHint.ANIMATING, 1);\n this.updateAnimations_();\n }\n\n /**\n * Determine if the view is being animated.\n * @return {boolean} The view is being animated.\n * @api\n */\n getAnimating() {\n return this.hints_[ViewHint.ANIMATING] > 0;\n }\n\n /**\n * Determine if the user is interacting with the view, such as panning or zooming.\n * @return {boolean} The view is being interacted with.\n * @api\n */\n getInteracting() {\n return this.hints_[ViewHint.INTERACTING] > 0;\n }\n\n /**\n * Cancel any ongoing animations.\n * @api\n */\n cancelAnimations() {\n this.setHint(ViewHint.ANIMATING, -this.hints_[ViewHint.ANIMATING]);\n let anchor;\n for (let i = 0, ii = this.animations_.length; i < ii; ++i) {\n const series = this.animations_[i];\n if (series[0].callback) {\n animationCallback(series[0].callback, false);\n }\n if (!anchor) {\n for (let j = 0, jj = series.length; j < jj; ++j) {\n const animation = series[j];\n if (!animation.complete) {\n anchor = animation.anchor;\n break;\n }\n }\n }\n }\n this.animations_.length = 0;\n this.cancelAnchor_ = anchor;\n this.nextCenter_ = null;\n this.nextResolution_ = NaN;\n this.nextRotation_ = NaN;\n }\n\n /**\n * Update all animations.\n */\n updateAnimations_() {\n if (this.updateAnimationKey_ !== undefined) {\n cancelAnimationFrame(this.updateAnimationKey_);\n this.updateAnimationKey_ = undefined;\n }\n if (!this.getAnimating()) {\n return;\n }\n const now = Date.now();\n let more = false;\n for (let i = this.animations_.length - 1; i >= 0; --i) {\n const series = this.animations_[i];\n let seriesComplete = true;\n for (let j = 0, jj = series.length; j < jj; ++j) {\n const animation = series[j];\n if (animation.complete) {\n continue;\n }\n const elapsed = now - animation.start;\n let fraction =\n animation.duration > 0 ? elapsed / animation.duration : 1;\n if (fraction >= 1) {\n animation.complete = true;\n fraction = 1;\n } else {\n seriesComplete = false;\n }\n const progress = animation.easing(fraction);\n if (animation.sourceCenter) {\n const x0 = animation.sourceCenter[0];\n const y0 = animation.sourceCenter[1];\n const x1 = animation.targetCenter[0];\n const y1 = animation.targetCenter[1];\n this.nextCenter_ = animation.targetCenter;\n const x = x0 + progress * (x1 - x0);\n const y = y0 + progress * (y1 - y0);\n this.targetCenter_ = [x, y];\n }\n if (animation.sourceResolution && animation.targetResolution) {\n const resolution =\n progress === 1\n ? animation.targetResolution\n : animation.sourceResolution +\n progress *\n (animation.targetResolution - animation.sourceResolution);\n if (animation.anchor) {\n const size = this.getViewportSize_(this.getRotation());\n const constrainedResolution = this.constraints_.resolution(\n resolution,\n 0,\n size,\n true,\n );\n this.targetCenter_ = this.calculateCenterZoom(\n constrainedResolution,\n animation.anchor,\n );\n }\n this.nextResolution_ = animation.targetResolution;\n this.targetResolution_ = resolution;\n this.applyTargetState_(true);\n }\n if (\n animation.sourceRotation !== undefined &&\n animation.targetRotation !== undefined\n ) {\n const rotation =\n progress === 1\n ? modulo(animation.targetRotation + Math.PI, 2 * Math.PI) -\n Math.PI\n : animation.sourceRotation +\n progress *\n (animation.targetRotation - animation.sourceRotation);\n if (animation.anchor) {\n const constrainedRotation = this.constraints_.rotation(\n rotation,\n true,\n );\n this.targetCenter_ = this.calculateCenterRotate(\n constrainedRotation,\n animation.anchor,\n );\n }\n this.nextRotation_ = animation.targetRotation;\n this.targetRotation_ = rotation;\n }\n this.applyTargetState_(true);\n more = true;\n if (!animation.complete) {\n break;\n }\n }\n if (seriesComplete) {\n this.animations_[i] = null;\n this.setHint(ViewHint.ANIMATING, -1);\n this.nextCenter_ = null;\n this.nextResolution_ = NaN;\n this.nextRotation_ = NaN;\n const callback = series[0].callback;\n if (callback) {\n animationCallback(callback, true);\n }\n }\n }\n // prune completed series\n this.animations_ = this.animations_.filter(Boolean);\n if (more && this.updateAnimationKey_ === undefined) {\n this.updateAnimationKey_ = requestAnimationFrame(\n this.updateAnimations_.bind(this),\n );\n }\n }\n\n /**\n * @param {number} rotation Target rotation.\n * @param {import(\"./coordinate.js\").Coordinate} anchor Rotation anchor.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center for rotation and anchor.\n */\n calculateCenterRotate(rotation, anchor) {\n let center;\n const currentCenter = this.getCenterInternal();\n if (currentCenter !== undefined) {\n center = [currentCenter[0] - anchor[0], currentCenter[1] - anchor[1]];\n rotateCoordinate(center, rotation - this.getRotation());\n addCoordinate(center, anchor);\n }\n return center;\n }\n\n /**\n * @param {number} resolution Target resolution.\n * @param {import(\"./coordinate.js\").Coordinate} anchor Zoom anchor.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Center for resolution and anchor.\n */\n calculateCenterZoom(resolution, anchor) {\n let center;\n const currentCenter = this.getCenterInternal();\n const currentResolution = this.getResolution();\n if (currentCenter !== undefined && currentResolution !== undefined) {\n const x =\n anchor[0] -\n (resolution * (anchor[0] - currentCenter[0])) / currentResolution;\n const y =\n anchor[1] -\n (resolution * (anchor[1] - currentCenter[1])) / currentResolution;\n center = [x, y];\n }\n return center;\n }\n\n /**\n * Returns the current viewport size.\n * @private\n * @param {number} [rotation] Take into account the rotation of the viewport when giving the size\n * @return {import(\"./size.js\").Size} Viewport size or `[100, 100]` when no viewport is found.\n */\n getViewportSize_(rotation) {\n const size = this.viewportSize_;\n if (rotation) {\n const w = size[0];\n const h = size[1];\n return [\n Math.abs(w * Math.cos(rotation)) + Math.abs(h * Math.sin(rotation)),\n Math.abs(w * Math.sin(rotation)) + Math.abs(h * Math.cos(rotation)),\n ];\n }\n return size;\n }\n\n /**\n * Stores the viewport size on the view. The viewport size is not read every time from the DOM\n * to avoid performance hit and layout reflow.\n * This should be done on map size change.\n * Note: the constraints are not resolved during an animation to avoid stopping it\n * @param {import(\"./size.js\").Size} [size] Viewport size; if undefined, [100, 100] is assumed\n */\n setViewportSize(size) {\n this.viewportSize_ = Array.isArray(size) ? size.slice() : [100, 100];\n if (!this.getAnimating()) {\n this.resolveConstraints(0);\n }\n }\n\n /**\n * Get the view center.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} The center of the view.\n * @observable\n * @api\n */\n getCenter() {\n const center = this.getCenterInternal();\n if (!center) {\n return center;\n }\n return toUserCoordinate(center, this.getProjection());\n }\n\n /**\n * Get the view center without transforming to user projection.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} The center of the view.\n */\n getCenterInternal() {\n return /** @type {import(\"./coordinate.js\").Coordinate|undefined} */ (\n this.get(ViewProperty.CENTER)\n );\n }\n\n /**\n * @return {Constraints} Constraints.\n */\n getConstraints() {\n return this.constraints_;\n }\n\n /**\n * @return {boolean} Resolution constraint is set\n */\n getConstrainResolution() {\n return this.get('constrainResolution');\n }\n\n /**\n * @param {Array} [hints] Destination array.\n * @return {Array} Hint.\n */\n getHints(hints) {\n if (hints !== undefined) {\n hints[0] = this.hints_[0];\n hints[1] = this.hints_[1];\n return hints;\n }\n return this.hints_.slice();\n }\n\n /**\n * Calculate the extent for the current view state and the passed box size.\n * @param {import(\"./size.js\").Size} [size] The pixel dimensions of the box\n * into which the calculated extent should fit. Defaults to the size of the\n * map the view is associated with.\n * If no map or multiple maps are connected to the view, provide the desired\n * box size (e.g. `map.getSize()`).\n * @return {import(\"./extent.js\").Extent} Extent.\n * @api\n */\n calculateExtent(size) {\n const extent = this.calculateExtentInternal(size);\n return toUserExtent(extent, this.getProjection());\n }\n\n /**\n * @param {import(\"./size.js\").Size} [size] Box pixel size. If not provided,\n * the map's last known viewport size will be used.\n * @return {import(\"./extent.js\").Extent} Extent.\n */\n calculateExtentInternal(size) {\n size = size || this.getViewportSizeMinusPadding_();\n const center = /** @type {!import(\"./coordinate.js\").Coordinate} */ (\n this.getCenterInternal()\n );\n assert(center, 'The view center is not defined');\n const resolution = /** @type {!number} */ (this.getResolution());\n assert(resolution !== undefined, 'The view resolution is not defined');\n const rotation = /** @type {!number} */ (this.getRotation());\n assert(rotation !== undefined, 'The view rotation is not defined');\n\n return getForViewAndSize(center, resolution, rotation, size);\n }\n\n /**\n * Get the maximum resolution of the view.\n * @return {number} The maximum resolution of the view.\n * @api\n */\n getMaxResolution() {\n return this.maxResolution_;\n }\n\n /**\n * Get the minimum resolution of the view.\n * @return {number} The minimum resolution of the view.\n * @api\n */\n getMinResolution() {\n return this.minResolution_;\n }\n\n /**\n * Get the maximum zoom level for the view.\n * @return {number} The maximum zoom level.\n * @api\n */\n getMaxZoom() {\n return /** @type {number} */ (\n this.getZoomForResolution(this.minResolution_)\n );\n }\n\n /**\n * Set a new maximum zoom level for the view.\n * @param {number} zoom The maximum zoom level.\n * @api\n */\n setMaxZoom(zoom) {\n this.applyOptions_(this.getUpdatedOptions_({maxZoom: zoom}));\n }\n\n /**\n * Get the minimum zoom level for the view.\n * @return {number} The minimum zoom level.\n * @api\n */\n getMinZoom() {\n return /** @type {number} */ (\n this.getZoomForResolution(this.maxResolution_)\n );\n }\n\n /**\n * Set a new minimum zoom level for the view.\n * @param {number} zoom The minimum zoom level.\n * @api\n */\n setMinZoom(zoom) {\n this.applyOptions_(this.getUpdatedOptions_({minZoom: zoom}));\n }\n\n /**\n * Set whether the view should allow intermediary zoom levels.\n * @param {boolean} enabled Whether the resolution is constrained.\n * @api\n */\n setConstrainResolution(enabled) {\n this.applyOptions_(this.getUpdatedOptions_({constrainResolution: enabled}));\n }\n\n /**\n * Get the view projection.\n * @return {import(\"./proj/Projection.js\").default} The projection of the view.\n * @api\n */\n getProjection() {\n return this.projection_;\n }\n\n /**\n * Get the view resolution.\n * @return {number|undefined} The resolution of the view.\n * @observable\n * @api\n */\n getResolution() {\n return /** @type {number|undefined} */ (this.get(ViewProperty.RESOLUTION));\n }\n\n /**\n * Get the resolutions for the view. This returns the array of resolutions\n * passed to the constructor of the View, or undefined if none were given.\n * @return {Array|undefined} The resolutions of the view.\n * @api\n */\n getResolutions() {\n return this.resolutions_;\n }\n\n /**\n * Get the resolution for a provided extent (in map units) and size (in pixels).\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {import(\"./size.js\").Size} [size] Box pixel size.\n * @return {number} The resolution at which the provided extent will render at\n * the given size.\n * @api\n */\n getResolutionForExtent(extent, size) {\n return this.getResolutionForExtentInternal(\n fromUserExtent(extent, this.getProjection()),\n size,\n );\n }\n\n /**\n * Get the resolution for a provided extent (in map units) and size (in pixels).\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {import(\"./size.js\").Size} [size] Box pixel size.\n * @return {number} The resolution at which the provided extent will render at\n * the given size.\n */\n getResolutionForExtentInternal(extent, size) {\n size = size || this.getViewportSizeMinusPadding_();\n const xResolution = getWidth(extent) / size[0];\n const yResolution = getHeight(extent) / size[1];\n return Math.max(xResolution, yResolution);\n }\n\n /**\n * Return a function that returns a value between 0 and 1 for a\n * resolution. Exponential scaling is assumed.\n * @param {number} [power] Power.\n * @return {function(number): number} Resolution for value function.\n */\n getResolutionForValueFunction(power) {\n power = power || 2;\n const maxResolution = this.getConstrainedResolution(this.maxResolution_);\n const minResolution = this.minResolution_;\n const max = Math.log(maxResolution / minResolution) / Math.log(power);\n return (\n /**\n * @param {number} value Value.\n * @return {number} Resolution.\n */\n function (value) {\n const resolution = maxResolution / Math.pow(power, value * max);\n return resolution;\n }\n );\n }\n\n /**\n * Get the view rotation.\n * @return {number} The rotation of the view in radians.\n * @observable\n * @api\n */\n getRotation() {\n return /** @type {number} */ (this.get(ViewProperty.ROTATION));\n }\n\n /**\n * Return a function that returns a resolution for a value between\n * 0 and 1. Exponential scaling is assumed.\n * @param {number} [power] Power.\n * @return {function(number): number} Value for resolution function.\n */\n getValueForResolutionFunction(power) {\n const logPower = Math.log(power || 2);\n const maxResolution = this.getConstrainedResolution(this.maxResolution_);\n const minResolution = this.minResolution_;\n const max = Math.log(maxResolution / minResolution) / logPower;\n return (\n /**\n * @param {number} resolution Resolution.\n * @return {number} Value.\n */\n function (resolution) {\n const value = Math.log(maxResolution / resolution) / logPower / max;\n return value;\n }\n );\n }\n\n /**\n * Returns the size of the viewport minus padding.\n * @private\n * @param {number} [rotation] Take into account the rotation of the viewport when giving the size\n * @return {import(\"./size.js\").Size} Viewport size reduced by the padding.\n */\n getViewportSizeMinusPadding_(rotation) {\n let size = this.getViewportSize_(rotation);\n const padding = this.padding_;\n if (padding) {\n size = [\n size[0] - padding[1] - padding[3],\n size[1] - padding[0] - padding[2],\n ];\n }\n return size;\n }\n\n /**\n * @return {State} View state.\n */\n getState() {\n const projection = this.getProjection();\n const resolution = this.getResolution();\n const rotation = this.getRotation();\n let center = /** @type {import(\"./coordinate.js\").Coordinate} */ (\n this.getCenterInternal()\n );\n const padding = this.padding_;\n if (padding) {\n const reducedSize = this.getViewportSizeMinusPadding_();\n center = calculateCenterOn(\n center,\n this.getViewportSize_(),\n [reducedSize[0] / 2 + padding[3], reducedSize[1] / 2 + padding[0]],\n resolution,\n rotation,\n );\n }\n return {\n center: center.slice(0),\n projection: projection !== undefined ? projection : null,\n resolution: resolution,\n nextCenter: this.nextCenter_,\n nextResolution: this.nextResolution_,\n nextRotation: this.nextRotation_,\n rotation: rotation,\n zoom: this.getZoom(),\n };\n }\n\n /**\n * @return {ViewStateLayerStateExtent} Like `FrameState`, but just `viewState` and `extent`.\n */\n getViewStateAndExtent() {\n return {\n viewState: this.getState(),\n extent: this.calculateExtent(),\n };\n }\n\n /**\n * Get the current zoom level. This method may return non-integer zoom levels\n * if the view does not constrain the resolution, or if an interaction or\n * animation is underway.\n * @return {number|undefined} Zoom.\n * @api\n */\n getZoom() {\n let zoom;\n const resolution = this.getResolution();\n if (resolution !== undefined) {\n zoom = this.getZoomForResolution(resolution);\n }\n return zoom;\n }\n\n /**\n * Get the zoom level for a resolution.\n * @param {number} resolution The resolution.\n * @return {number|undefined} The zoom level for the provided resolution.\n * @api\n */\n getZoomForResolution(resolution) {\n let offset = this.minZoom_ || 0;\n let max, zoomFactor;\n if (this.resolutions_) {\n const nearest = linearFindNearest(this.resolutions_, resolution, 1);\n offset = nearest;\n max = this.resolutions_[nearest];\n if (nearest == this.resolutions_.length - 1) {\n zoomFactor = 2;\n } else {\n zoomFactor = max / this.resolutions_[nearest + 1];\n }\n } else {\n max = this.maxResolution_;\n zoomFactor = this.zoomFactor_;\n }\n return offset + Math.log(max / resolution) / Math.log(zoomFactor);\n }\n\n /**\n * Get the resolution for a zoom level.\n * @param {number} zoom Zoom level.\n * @return {number} The view resolution for the provided zoom level.\n * @api\n */\n getResolutionForZoom(zoom) {\n if (this.resolutions_?.length) {\n if (this.resolutions_.length === 1) {\n return this.resolutions_[0];\n }\n const baseLevel = clamp(\n Math.floor(zoom),\n 0,\n this.resolutions_.length - 2,\n );\n const zoomFactor =\n this.resolutions_[baseLevel] / this.resolutions_[baseLevel + 1];\n return (\n this.resolutions_[baseLevel] /\n Math.pow(zoomFactor, clamp(zoom - baseLevel, 0, 1))\n );\n }\n return (\n this.maxResolution_ / Math.pow(this.zoomFactor_, zoom - this.minZoom_)\n );\n }\n\n /**\n * Fit the given geometry or extent based on the given map size and border.\n * The size is pixel dimensions of the box to fit the extent into.\n * In most cases you will want to use the map size, that is `map.getSize()`.\n * Takes care of the map angle.\n * @param {import(\"./geom/SimpleGeometry.js\").default|import(\"./extent.js\").Extent} geometryOrExtent The geometry or\n * extent to fit the view to.\n * @param {FitOptions} [options] Options.\n * @api\n */\n fit(geometryOrExtent, options) {\n /** @type {import(\"./geom/SimpleGeometry.js\").default} */\n let geometry;\n assert(\n Array.isArray(geometryOrExtent) ||\n typeof (/** @type {?} */ (geometryOrExtent).getSimplifiedGeometry) ===\n 'function',\n 'Invalid extent or geometry provided as `geometry`',\n );\n if (Array.isArray(geometryOrExtent)) {\n assert(\n !isEmpty(geometryOrExtent),\n 'Cannot fit empty extent provided as `geometry`',\n );\n const extent = fromUserExtent(geometryOrExtent, this.getProjection());\n geometry = polygonFromExtent(extent);\n } else if (geometryOrExtent.getType() === 'Circle') {\n const extent = fromUserExtent(\n geometryOrExtent.getExtent(),\n this.getProjection(),\n );\n geometry = polygonFromExtent(extent);\n geometry.rotate(this.getRotation(), getCenter(extent));\n } else {\n const userProjection = getUserProjection();\n if (userProjection) {\n geometry = /** @type {import(\"./geom/SimpleGeometry.js\").default} */ (\n geometryOrExtent\n .clone()\n .transform(userProjection, this.getProjection())\n );\n } else {\n geometry = geometryOrExtent;\n }\n }\n\n this.fitInternal(geometry, options);\n }\n\n /**\n * Calculate rotated extent\n * @param {import(\"./geom/SimpleGeometry.js\").default} geometry The geometry.\n * @return {import(\"./extent.js\").Extent} The rotated extent for the geometry.\n */\n rotatedExtentForGeometry(geometry) {\n const rotation = this.getRotation();\n const cosAngle = Math.cos(rotation);\n const sinAngle = Math.sin(-rotation);\n const coords = geometry.getFlatCoordinates();\n const stride = geometry.getStride();\n let minRotX = +Infinity;\n let minRotY = +Infinity;\n let maxRotX = -Infinity;\n let maxRotY = -Infinity;\n for (let i = 0, ii = coords.length; i < ii; i += stride) {\n const rotX = coords[i] * cosAngle - coords[i + 1] * sinAngle;\n const rotY = coords[i] * sinAngle + coords[i + 1] * cosAngle;\n minRotX = Math.min(minRotX, rotX);\n minRotY = Math.min(minRotY, rotY);\n maxRotX = Math.max(maxRotX, rotX);\n maxRotY = Math.max(maxRotY, rotY);\n }\n return [minRotX, minRotY, maxRotX, maxRotY];\n }\n\n /**\n * @param {import(\"./geom/SimpleGeometry.js\").default} geometry The geometry.\n * @param {FitOptions} [options] Options.\n */\n fitInternal(geometry, options) {\n options = options || {};\n let size = options.size;\n if (!size) {\n size = this.getViewportSizeMinusPadding_();\n }\n const padding =\n options.padding !== undefined ? options.padding : [0, 0, 0, 0];\n const nearest = options.nearest !== undefined ? options.nearest : false;\n let minResolution;\n if (options.minResolution !== undefined) {\n minResolution = options.minResolution;\n } else if (options.maxZoom !== undefined) {\n minResolution = this.getResolutionForZoom(options.maxZoom);\n } else {\n minResolution = 0;\n }\n\n const rotatedExtent = this.rotatedExtentForGeometry(geometry);\n\n // calculate resolution\n let resolution = this.getResolutionForExtentInternal(rotatedExtent, [\n size[0] - padding[1] - padding[3],\n size[1] - padding[0] - padding[2],\n ]);\n resolution = isNaN(resolution)\n ? minResolution\n : Math.max(resolution, minResolution);\n resolution = this.getConstrainedResolution(resolution, nearest ? 0 : 1);\n\n // calculate center\n const rotation = this.getRotation();\n const sinAngle = Math.sin(rotation);\n const cosAngle = Math.cos(rotation);\n const centerRot = getCenter(rotatedExtent);\n centerRot[0] += ((padding[1] - padding[3]) / 2) * resolution;\n centerRot[1] += ((padding[0] - padding[2]) / 2) * resolution;\n const centerX = centerRot[0] * cosAngle - centerRot[1] * sinAngle;\n const centerY = centerRot[1] * cosAngle + centerRot[0] * sinAngle;\n const center = this.getConstrainedCenter([centerX, centerY], resolution);\n const callback = options.callback ? options.callback : VOID;\n\n if (options.duration !== undefined) {\n this.animateInternal(\n {\n resolution: resolution,\n center: center,\n duration: options.duration,\n easing: options.easing,\n },\n callback,\n );\n } else {\n this.targetResolution_ = resolution;\n this.targetCenter_ = center;\n this.applyTargetState_(false, true);\n animationCallback(callback, true);\n }\n }\n\n /**\n * Center on coordinate and view position.\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"./size.js\").Size} size Box pixel size.\n * @param {import(\"./pixel.js\").Pixel} position Position on the view to center on.\n * @api\n */\n centerOn(coordinate, size, position) {\n this.centerOnInternal(\n fromUserCoordinate(coordinate, this.getProjection()),\n size,\n position,\n );\n }\n\n /**\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"./size.js\").Size} size Box pixel size.\n * @param {import(\"./pixel.js\").Pixel} position Position on the view to center on.\n */\n centerOnInternal(coordinate, size, position) {\n this.setCenterInternal(\n calculateCenterOn(\n coordinate,\n size,\n position,\n this.getResolution(),\n this.getRotation(),\n ),\n );\n }\n\n /**\n * Calculates the shift between map and viewport center.\n * @param {import(\"./coordinate.js\").Coordinate} center Center.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @param {import(\"./size.js\").Size} size Size.\n * @return {Array|undefined} Center shift.\n */\n calculateCenterShift(center, resolution, rotation, size) {\n let centerShift;\n const padding = this.padding_;\n if (padding && center) {\n const reducedSize = this.getViewportSizeMinusPadding_(-rotation);\n const shiftedCenter = calculateCenterOn(\n center,\n size,\n [reducedSize[0] / 2 + padding[3], reducedSize[1] / 2 + padding[0]],\n resolution,\n rotation,\n );\n centerShift = [\n center[0] - shiftedCenter[0],\n center[1] - shiftedCenter[1],\n ];\n }\n return centerShift;\n }\n\n /**\n * @return {boolean} Is defined.\n */\n isDef() {\n return !!this.getCenterInternal() && this.getResolution() !== undefined;\n }\n\n /**\n * Adds relative coordinates to the center of the view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate} deltaCoordinates Relative value to add.\n * @api\n */\n adjustCenter(deltaCoordinates) {\n const center = toUserCoordinate(this.targetCenter_, this.getProjection());\n this.setCenter([\n center[0] + deltaCoordinates[0],\n center[1] + deltaCoordinates[1],\n ]);\n }\n\n /**\n * Adds relative coordinates to the center of the view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate} deltaCoordinates Relative value to add.\n */\n adjustCenterInternal(deltaCoordinates) {\n const center = this.targetCenter_;\n this.setCenterInternal([\n center[0] + deltaCoordinates[0],\n center[1] + deltaCoordinates[1],\n ]);\n }\n\n /**\n * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} ratio The ratio to apply on the view resolution.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n adjustResolution(ratio, anchor) {\n anchor = anchor && fromUserCoordinate(anchor, this.getProjection());\n this.adjustResolutionInternal(ratio, anchor);\n }\n\n /**\n * Multiply the view resolution by a ratio, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} ratio The ratio to apply on the view resolution.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n adjustResolutionInternal(ratio, anchor) {\n const isMoving = this.getAnimating() || this.getInteracting();\n const size = this.getViewportSize_(this.getRotation());\n const newResolution = this.constraints_.resolution(\n this.targetResolution_ * ratio,\n 0,\n size,\n isMoving,\n );\n\n if (anchor) {\n this.targetCenter_ = this.calculateCenterZoom(newResolution, anchor);\n }\n\n this.targetResolution_ *= ratio;\n this.applyTargetState_();\n }\n\n /**\n * Adds a value to the view zoom level, optionally using an anchor. Any resolution\n * constraint will apply.\n * @param {number} delta Relative value to add to the zoom level.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n adjustZoom(delta, anchor) {\n this.adjustResolution(Math.pow(this.zoomFactor_, -delta), anchor);\n }\n\n /**\n * Adds a value to the view rotation, optionally using an anchor. Any rotation\n * constraint will apply.\n * @param {number} delta Relative value to add to the zoom rotation, in radians.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The rotation center.\n * @api\n */\n adjustRotation(delta, anchor) {\n if (anchor) {\n anchor = fromUserCoordinate(anchor, this.getProjection());\n }\n this.adjustRotationInternal(delta, anchor);\n }\n\n /**\n * @param {number} delta Relative value to add to the zoom rotation, in radians.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The rotation center.\n */\n adjustRotationInternal(delta, anchor) {\n const isMoving = this.getAnimating() || this.getInteracting();\n const newRotation = this.constraints_.rotation(\n this.targetRotation_ + delta,\n isMoving,\n );\n if (anchor) {\n this.targetCenter_ = this.calculateCenterRotate(newRotation, anchor);\n }\n this.targetRotation_ += delta;\n this.applyTargetState_();\n }\n\n /**\n * Set the center of the current view. Any extent constraint will apply.\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center The center of the view.\n * @observable\n * @api\n */\n setCenter(center) {\n this.setCenterInternal(\n center ? fromUserCoordinate(center, this.getProjection()) : center,\n );\n }\n\n /**\n * Set the center using the view projection (not the user projection).\n * @param {import(\"./coordinate.js\").Coordinate|undefined} center The center of the view.\n */\n setCenterInternal(center) {\n this.targetCenter_ = center;\n this.applyTargetState_();\n }\n\n /**\n * @param {import(\"./ViewHint.js\").default} hint Hint.\n * @param {number} delta Delta.\n * @return {number} New value.\n */\n setHint(hint, delta) {\n this.hints_[hint] += delta;\n this.changed();\n return this.hints_[hint];\n }\n\n /**\n * Set the resolution for this view. Any resolution constraint will apply.\n * @param {number|undefined} resolution The resolution of the view.\n * @observable\n * @api\n */\n setResolution(resolution) {\n this.targetResolution_ = resolution;\n this.applyTargetState_();\n }\n\n /**\n * Set the rotation for this view. Any rotation constraint will apply.\n * @param {number} rotation The rotation of the view in radians.\n * @observable\n * @api\n */\n setRotation(rotation) {\n this.targetRotation_ = rotation;\n this.applyTargetState_();\n }\n\n /**\n * Zoom to a specific zoom level. Any resolution constrain will apply.\n * @param {number} zoom Zoom level.\n * @api\n */\n setZoom(zoom) {\n this.setResolution(this.getResolutionForZoom(zoom));\n }\n\n /**\n * Recompute rotation/resolution/center based on target values.\n * Note: we have to compute rotation first, then resolution and center considering that\n * parameters can influence one another in case a view extent constraint is present.\n * @param {boolean} [doNotCancelAnims] Do not cancel animations.\n * @param {boolean} [forceMoving] Apply constraints as if the view is moving.\n * @private\n */\n applyTargetState_(doNotCancelAnims, forceMoving) {\n const isMoving =\n this.getAnimating() || this.getInteracting() || forceMoving;\n\n // compute rotation\n const newRotation = this.constraints_.rotation(\n this.targetRotation_,\n isMoving,\n );\n const size = this.getViewportSize_(newRotation);\n const newResolution = this.constraints_.resolution(\n this.targetResolution_,\n 0,\n size,\n isMoving,\n );\n const newCenter = this.constraints_.center(\n this.targetCenter_,\n newResolution,\n size,\n isMoving,\n this.calculateCenterShift(\n this.targetCenter_,\n newResolution,\n newRotation,\n size,\n ),\n );\n\n if (this.get(ViewProperty.ROTATION) !== newRotation) {\n this.set(ViewProperty.ROTATION, newRotation);\n }\n if (this.get(ViewProperty.RESOLUTION) !== newResolution) {\n this.set(ViewProperty.RESOLUTION, newResolution);\n this.set('zoom', this.getZoom(), true);\n }\n if (\n !newCenter ||\n !this.get(ViewProperty.CENTER) ||\n !equals(this.get(ViewProperty.CENTER), newCenter)\n ) {\n this.set(ViewProperty.CENTER, newCenter);\n }\n\n if (this.getAnimating() && !doNotCancelAnims) {\n this.cancelAnimations();\n }\n this.cancelAnchor_ = undefined;\n }\n\n /**\n * If any constraints need to be applied, an animation will be triggered.\n * This is typically done on interaction end.\n * Note: calling this with a duration of 0 will apply the constrained values straight away,\n * without animation.\n * @param {number} [duration] The animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n resolveConstraints(duration, resolutionDirection, anchor) {\n duration = duration !== undefined ? duration : 200;\n const direction = resolutionDirection || 0;\n\n const newRotation = this.constraints_.rotation(this.targetRotation_);\n const size = this.getViewportSize_(newRotation);\n const newResolution = this.constraints_.resolution(\n this.targetResolution_,\n direction,\n size,\n );\n const newCenter = this.constraints_.center(\n this.targetCenter_,\n newResolution,\n size,\n false,\n this.calculateCenterShift(\n this.targetCenter_,\n newResolution,\n newRotation,\n size,\n ),\n );\n\n if (duration === 0 && !this.cancelAnchor_) {\n this.targetResolution_ = newResolution;\n this.targetRotation_ = newRotation;\n this.targetCenter_ = newCenter;\n this.applyTargetState_();\n return;\n }\n\n anchor = anchor || (duration === 0 ? this.cancelAnchor_ : undefined);\n this.cancelAnchor_ = undefined;\n\n if (\n this.getResolution() !== newResolution ||\n this.getRotation() !== newRotation ||\n !this.getCenterInternal() ||\n !equals(this.getCenterInternal(), newCenter)\n ) {\n if (this.getAnimating()) {\n this.cancelAnimations();\n }\n\n this.animateInternal({\n rotation: newRotation,\n center: newCenter,\n resolution: newResolution,\n duration: duration,\n easing: easeOut,\n anchor: anchor,\n });\n }\n }\n\n /**\n * Notify the View that an interaction has started.\n * The view state will be resolved to a stable one if needed\n * (depending on its constraints).\n * @api\n */\n beginInteraction() {\n this.resolveConstraints(0);\n\n this.setHint(ViewHint.INTERACTING, 1);\n }\n\n /**\n * Notify the View that an interaction has ended. The view state will be resolved\n * to a stable one if needed (depending on its constraints).\n * @param {number} [duration] Animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n * @api\n */\n endInteraction(duration, resolutionDirection, anchor) {\n anchor = anchor && fromUserCoordinate(anchor, this.getProjection());\n this.endInteractionInternal(duration, resolutionDirection, anchor);\n }\n\n /**\n * Notify the View that an interaction has ended. The view state will be resolved\n * to a stable one if needed (depending on its constraints).\n * @param {number} [duration] Animation duration in ms.\n * @param {number} [resolutionDirection] Which direction to zoom.\n * @param {import(\"./coordinate.js\").Coordinate} [anchor] The origin of the transformation.\n */\n endInteractionInternal(duration, resolutionDirection, anchor) {\n if (!this.getInteracting()) {\n return;\n }\n this.setHint(ViewHint.INTERACTING, -1);\n this.resolveConstraints(duration, resolutionDirection, anchor);\n }\n\n /**\n * Get a valid position for the view center according to the current constraints.\n * @param {import(\"./coordinate.js\").Coordinate|undefined} targetCenter Target center position.\n * @param {number} [targetResolution] Target resolution. If not supplied, the current one will be used.\n * This is useful to guess a valid center position at a different zoom level.\n * @return {import(\"./coordinate.js\").Coordinate|undefined} Valid center position.\n */\n getConstrainedCenter(targetCenter, targetResolution) {\n const size = this.getViewportSize_(this.getRotation());\n return this.constraints_.center(\n targetCenter,\n targetResolution || this.getResolution(),\n size,\n );\n }\n\n /**\n * Get a valid zoom level according to the current view constraints.\n * @param {number|undefined} targetZoom Target zoom.\n * @param {number} [direction] Indicate which resolution should be used\n * by a renderer if the view resolution does not match any resolution of the tile source.\n * If 0, the nearest resolution will be used. If 1, the nearest lower resolution\n * will be used. If -1, the nearest higher resolution will be used.\n * @return {number|undefined} Valid zoom level.\n */\n getConstrainedZoom(targetZoom, direction) {\n const targetRes = this.getResolutionForZoom(targetZoom);\n return this.getZoomForResolution(\n this.getConstrainedResolution(targetRes, direction),\n );\n }\n\n /**\n * Get a valid resolution according to the current view constraints.\n * @param {number|undefined} targetResolution Target resolution.\n * @param {number} [direction] Indicate which resolution should be used\n * by a renderer if the view resolution does not match any resolution of the tile source.\n * If 0, the nearest resolution will be used. If 1, the nearest lower resolution\n * will be used. If -1, the nearest higher resolution will be used.\n * @return {number|undefined} Valid resolution.\n */\n getConstrainedResolution(targetResolution, direction) {\n direction = direction || 0;\n const size = this.getViewportSize_(this.getRotation());\n\n return this.constraints_.resolution(targetResolution, direction, size);\n }\n}\n\n/**\n * @param {Function} callback Callback.\n * @param {*} returnValue Return value.\n */\nfunction animationCallback(callback, returnValue) {\n setTimeout(function () {\n callback(returnValue);\n }, 0);\n}\n\n/**\n * @param {ViewOptions} options View options.\n * @return {import(\"./centerconstraint.js\").Type} The constraint.\n */\nexport function createCenterConstraint(options) {\n if (options.extent !== undefined) {\n const smooth =\n options.smoothExtentConstraint !== undefined\n ? options.smoothExtentConstraint\n : true;\n return createExtent(options.extent, options.constrainOnlyCenter, smooth);\n }\n\n const projection = createProjection(options.projection, 'EPSG:3857');\n if (options.multiWorld !== true && projection.isGlobal()) {\n const extent = projection.getExtent().slice();\n extent[0] = -Infinity;\n extent[2] = Infinity;\n return createExtent(extent, false, false);\n }\n\n return centerNone;\n}\n\n/**\n * @param {ViewOptions} options View options.\n * @return {{constraint: import(\"./resolutionconstraint.js\").Type, maxResolution: number,\n * minResolution: number, minZoom: number, zoomFactor: number}} The constraint.\n */\nexport function createResolutionConstraint(options) {\n let resolutionConstraint;\n let maxResolution;\n let minResolution;\n\n // TODO: move these to be ol constants\n // see https://github.com/openlayers/openlayers/issues/2076\n const defaultMaxZoom = 28;\n const defaultZoomFactor = 2;\n\n let minZoom =\n options.minZoom !== undefined ? options.minZoom : DEFAULT_MIN_ZOOM;\n\n let maxZoom =\n options.maxZoom !== undefined ? options.maxZoom : defaultMaxZoom;\n\n const zoomFactor =\n options.zoomFactor !== undefined ? options.zoomFactor : defaultZoomFactor;\n\n const multiWorld =\n options.multiWorld !== undefined ? options.multiWorld : false;\n\n const smooth =\n options.smoothResolutionConstraint !== undefined\n ? options.smoothResolutionConstraint\n : true;\n\n const showFullExtent =\n options.showFullExtent !== undefined ? options.showFullExtent : false;\n\n const projection = createProjection(options.projection, 'EPSG:3857');\n const projExtent = projection.getExtent();\n let constrainOnlyCenter = options.constrainOnlyCenter;\n let extent = options.extent;\n if (!multiWorld && !extent && projection.isGlobal()) {\n constrainOnlyCenter = false;\n extent = projExtent;\n }\n\n if (options.resolutions !== undefined) {\n const resolutions = options.resolutions;\n maxResolution = resolutions[minZoom];\n minResolution =\n resolutions[maxZoom] !== undefined\n ? resolutions[maxZoom]\n : resolutions[resolutions.length - 1];\n\n if (options.constrainResolution) {\n resolutionConstraint = createSnapToResolutions(\n resolutions,\n smooth,\n !constrainOnlyCenter && extent,\n showFullExtent,\n );\n } else {\n resolutionConstraint = createMinMaxResolution(\n maxResolution,\n minResolution,\n smooth,\n !constrainOnlyCenter && extent,\n showFullExtent,\n );\n }\n } else {\n // calculate the default min and max resolution\n const size = !projExtent\n ? // use an extent that can fit the whole world if need be\n (360 * METERS_PER_UNIT.degrees) / projection.getMetersPerUnit()\n : Math.max(getWidth(projExtent), getHeight(projExtent));\n\n const defaultMaxResolution =\n size / DEFAULT_TILE_SIZE / Math.pow(defaultZoomFactor, DEFAULT_MIN_ZOOM);\n\n const defaultMinResolution =\n defaultMaxResolution /\n Math.pow(defaultZoomFactor, defaultMaxZoom - DEFAULT_MIN_ZOOM);\n\n // user provided maxResolution takes precedence\n maxResolution = options.maxResolution;\n if (maxResolution !== undefined) {\n minZoom = 0;\n } else {\n maxResolution = defaultMaxResolution / Math.pow(zoomFactor, minZoom);\n }\n\n // user provided minResolution takes precedence\n minResolution = options.minResolution;\n if (minResolution === undefined) {\n if (options.maxZoom !== undefined) {\n if (options.maxResolution !== undefined) {\n minResolution = maxResolution / Math.pow(zoomFactor, maxZoom);\n } else {\n minResolution = defaultMaxResolution / Math.pow(zoomFactor, maxZoom);\n }\n } else {\n minResolution = defaultMinResolution;\n }\n }\n\n // given discrete zoom levels, minResolution may be different than provided\n maxZoom =\n minZoom +\n Math.floor(\n Math.log(maxResolution / minResolution) / Math.log(zoomFactor),\n );\n minResolution = maxResolution / Math.pow(zoomFactor, maxZoom - minZoom);\n\n if (options.constrainResolution) {\n resolutionConstraint = createSnapToPower(\n zoomFactor,\n maxResolution,\n minResolution,\n smooth,\n !constrainOnlyCenter && extent,\n showFullExtent,\n );\n } else {\n resolutionConstraint = createMinMaxResolution(\n maxResolution,\n minResolution,\n smooth,\n !constrainOnlyCenter && extent,\n showFullExtent,\n );\n }\n }\n return {\n constraint: resolutionConstraint,\n maxResolution: maxResolution,\n minResolution: minResolution,\n minZoom: minZoom,\n zoomFactor: zoomFactor,\n };\n}\n\n/**\n * @param {ViewOptions} options View options.\n * @return {import(\"./rotationconstraint.js\").Type} Rotation constraint.\n */\nexport function createRotationConstraint(options) {\n const enableRotation =\n options.enableRotation !== undefined ? options.enableRotation : true;\n if (enableRotation) {\n const constrainRotation = options.constrainRotation;\n if (constrainRotation === undefined || constrainRotation === true) {\n return createSnapToZero();\n }\n if (constrainRotation === false) {\n return rotationNone;\n }\n if (typeof constrainRotation === 'number') {\n return createSnapToN(constrainRotation);\n }\n return rotationNone;\n }\n return disable;\n}\n\n/**\n * Determine if an animation involves no view change.\n * @param {Animation} animation The animation.\n * @return {boolean} The animation involves no view change.\n */\nexport function isNoopAnimation(animation) {\n if (animation.sourceCenter && animation.targetCenter) {\n if (!coordinatesEqual(animation.sourceCenter, animation.targetCenter)) {\n return false;\n }\n }\n if (animation.sourceResolution !== animation.targetResolution) {\n return false;\n }\n if (animation.sourceRotation !== animation.targetRotation) {\n return false;\n }\n return true;\n}\n\n/**\n * @param {import(\"./coordinate.js\").Coordinate} coordinate Coordinate.\n * @param {import(\"./size.js\").Size} size Box pixel size.\n * @param {import(\"./pixel.js\").Pixel} position Position on the view to center on.\n * @param {number} resolution Resolution.\n * @param {number} rotation Rotation.\n * @return {import(\"./coordinate.js\").Coordinate} Shifted center.\n */\nfunction calculateCenterOn(coordinate, size, position, resolution, rotation) {\n // calculate rotated position\n const cosAngle = Math.cos(-rotation);\n let sinAngle = Math.sin(-rotation);\n let rotX = coordinate[0] * cosAngle - coordinate[1] * sinAngle;\n let rotY = coordinate[1] * cosAngle + coordinate[0] * sinAngle;\n rotX += (size[0] / 2 - position[0]) * resolution;\n rotY += (position[1] - size[1] / 2) * resolution;\n\n // go back to original angle\n sinAngle = -sinAngle; // go back to original rotation\n const centerX = rotX * cosAngle - rotY * sinAngle;\n const centerY = rotY * cosAngle + rotX * sinAngle;\n\n return [centerX, centerY];\n}\n\nexport default View;\n\n/**\n * @typedef {function(ViewOptions):ViewOptions} ViewTransform\n */\n\n/**\n * Adds higher resolutions.\n * @param {number} num The number of higher resolution levels to use.\n * @return {ViewTransform} A view transform.\n */\nexport function withHigherResolutions(num) {\n return function (options) {\n if (!options.resolutions) {\n return options;\n }\n const resolutions = [...options.resolutions];\n const highest = resolutions[resolutions.length - 1];\n for (let i = 0; i < num; ++i) {\n resolutions.push(highest / Math.pow(2, i + 1));\n }\n return {\n ...options,\n resolutions,\n };\n };\n}\n\n/**\n * Adds lower resolutions.\n * @param {number} num The number of lower resolution levels to use.\n * @return {ViewTransform} A view transform.\n * @api\n */\nexport function withLowerResolutions(num) {\n return function (options) {\n if (!options.resolutions) {\n return options;\n }\n const resolutions = [...options.resolutions];\n const lowest = resolutions[0];\n for (let i = 0; i < num; ++i) {\n resolutions.unshift(lowest * Math.pow(2, i + 1));\n }\n return {\n ...options,\n resolutions,\n };\n };\n}\n\n/**\n * Applies a center based on the extent.\n * @return {ViewTransform} A view transform.\n * @api\n */\nexport function withExtentCenter() {\n return function (options) {\n if (!options.extent) {\n return options;\n }\n const center = getCenter(options.extent);\n const newOptions = {...options, center};\n delete newOptions.extent;\n return newOptions;\n };\n}\n\n/**\n * Applies a zoom level.\n * @param {number} z The zoom level.\n * @return {ViewTransform} A view transform.\n * @api\n */\nexport function withZoom(z) {\n return function (options) {\n return {...options, zoom: z};\n };\n}\n\n/**\n * Applies a series of transforms to a view that is resolved from a source.\n * @param {import(\"./source/Source.js\").default} source The source.\n * @param {...ViewTransform} transforms The transforms to apply.\n * @return {Promise} The view options.\n * @api\n */\nexport async function getView(source, ...transforms) {\n let config = await source.getView();\n for (const transform of transforms) {\n config = transform(config);\n }\n return config;\n}\n","/**\n * @module ol/css\n */\n\n/**\n * @typedef {Object} FontParameters\n * @property {string} style Style.\n * @property {string} variant Variant.\n * @property {string} weight Weight.\n * @property {string} size Size.\n * @property {string} lineHeight LineHeight.\n * @property {string} family Family.\n * @property {Array} families Families.\n */\n\n/**\n * The CSS class for hidden feature.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_HIDDEN = 'ol-hidden';\n\n/**\n * The CSS class that we'll give the DOM elements to have them selectable.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_SELECTABLE = 'ol-selectable';\n\n/**\n * The CSS class that we'll give the DOM elements to have them unselectable.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_UNSELECTABLE = 'ol-unselectable';\n\n/**\n * The CSS class for unsupported feature.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_UNSUPPORTED = 'ol-unsupported';\n\n/**\n * The CSS class for controls.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_CONTROL = 'ol-control';\n\n/**\n * The CSS class that we'll give the DOM elements that are collapsed, i.e.\n * to those elements which usually can be expanded.\n *\n * @const\n * @type {string}\n */\nexport const CLASS_COLLAPSED = 'ol-collapsed';\n\n/**\n * From https://stackoverflow.com/questions/10135697/regex-to-parse-any-css-font\n * @type {RegExp}\n */\nconst fontRegEx = new RegExp(\n [\n '^\\\\s*(?=(?:(?:[-a-z]+\\\\s*){0,2}(italic|oblique))?)',\n '(?=(?:(?:[-a-z]+\\\\s*){0,2}(small-caps))?)',\n '(?=(?:(?:[-a-z]+\\\\s*){0,2}(bold(?:er)?|lighter|[1-9]00 ))?)',\n '(?:(?:normal|\\\\1|\\\\2|\\\\3)\\\\s*){0,3}((?:xx?-)?',\n '(?:small|large)|medium|smaller|larger|[\\\\.\\\\d]+(?:\\\\%|in|[cem]m|ex|p[ctx]))',\n '(?:\\\\s*\\\\/\\\\s*(normal|[\\\\.\\\\d]+(?:\\\\%|in|[cem]m|ex|p[ctx])?))',\n '?\\\\s*([-,\\\\\"\\\\\\'\\\\sa-z0-9]+?)\\\\s*$',\n ].join(''),\n 'i',\n);\n/** @type {Array<'style'|'variant'|'weight'|'size'|'lineHeight'|'family'>} */\nconst fontRegExMatchIndex = [\n 'style',\n 'variant',\n 'weight',\n 'size',\n 'lineHeight',\n 'family',\n];\n\n/** @type {Object} */\nexport const fontWeights = {\n normal: 400,\n bold: 700,\n};\n\n/**\n * Get the list of font families from a font spec. Note that this doesn't work\n * for font families that have commas in them.\n * @param {string} fontSpec The CSS font property.\n * @return {FontParameters|null} The font parameters (or null if the input spec is invalid).\n */\nexport const getFontParameters = function (fontSpec) {\n const match = fontSpec.match(fontRegEx);\n if (!match) {\n return null;\n }\n const style = /** @type {FontParameters} */ ({\n lineHeight: 'normal',\n size: '1.2em',\n style: 'normal',\n weight: '400',\n variant: 'normal',\n });\n for (let i = 0, ii = fontRegExMatchIndex.length; i < ii; ++i) {\n const value = match[i + 1];\n if (value !== undefined) {\n style[fontRegExMatchIndex[i]] =\n typeof value === 'string' ? value.trim() : value;\n }\n }\n if (isNaN(Number(style.weight)) && style.weight in fontWeights) {\n style.weight = fontWeights[style.weight];\n }\n style.families = style.family\n .split(/,\\s?/)\n .map((f) => f.trim().replace(/^['\"]|['\"]$/g, ''));\n return style;\n};\n","import {WORKER_OFFSCREEN_CANVAS} from './has.js';\n\n/**\n * @module ol/dom\n */\n\n/**\n * @typedef {Object} ImageAttributes\n * @property {string|null} [crossOrigin] Cross origin.\n * @property {ReferrerPolicy} [referrerPolicy] Referrer policy.\n */\n\n//FIXME Move this function to the canvas module\n/**\n * Create an html canvas element and returns its 2d context.\n * @param {number} [width] Canvas width.\n * @param {number} [height] Canvas height.\n * @param {Array} [canvasPool] Canvas pool to take existing canvas from.\n * @param {CanvasRenderingContext2DSettings} [settings] CanvasRenderingContext2DSettings\n * @return {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D} The context.\n */\nexport function createCanvasContext2D(width, height, canvasPool, settings) {\n /** @type {HTMLCanvasElement|OffscreenCanvas} */\n let canvas;\n if (canvasPool && canvasPool.length) {\n canvas = /** @type {HTMLCanvasElement} */ (canvasPool.shift());\n } else if (WORKER_OFFSCREEN_CANVAS) {\n canvas = new (class extends OffscreenCanvas {\n style = {};\n })(width ?? 300, height ?? 150);\n } else {\n canvas = document.createElement('canvas');\n }\n if (width) {\n canvas.width = width;\n }\n if (height) {\n canvas.height = height;\n }\n return /** @type {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D} */ (\n canvas.getContext('2d', settings)\n );\n}\n\n/**\n * @type {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D}\n */\nlet sharedCanvasContext;\n\n/**\n * @return {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D} Shared canvas context.\n */\nexport function getSharedCanvasContext2D() {\n if (!sharedCanvasContext) {\n sharedCanvasContext = createCanvasContext2D(1, 1);\n }\n return sharedCanvasContext;\n}\n\n/**\n * Releases canvas memory to avoid exceeding memory limits in Safari.\n * See https://pqina.nl/blog/total-canvas-memory-use-exceeds-the-maximum-limit/\n * @param {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D} context Context.\n */\nexport function releaseCanvas(context) {\n const canvas = context.canvas;\n canvas.width = 1;\n canvas.height = 1;\n context.clearRect(0, 0, 1, 1);\n}\n\n/**\n * Get the current computed width for the given element including margin,\n * padding and border.\n * Equivalent to jQuery's `$(el).outerWidth(true)`.\n * @param {!HTMLElement} element Element.\n * @return {number} The width.\n */\nexport function outerWidth(element) {\n let width = element.offsetWidth;\n const style = getComputedStyle(element);\n width += parseInt(style.marginLeft, 10) + parseInt(style.marginRight, 10);\n\n return width;\n}\n\n/**\n * Get the current computed height for the given element including margin,\n * padding and border.\n * Equivalent to jQuery's `$(el).outerHeight(true)`.\n * @param {!HTMLElement} element Element.\n * @return {number} The height.\n */\nexport function outerHeight(element) {\n let height = element.offsetHeight;\n const style = getComputedStyle(element);\n height += parseInt(style.marginTop, 10) + parseInt(style.marginBottom, 10);\n\n return height;\n}\n\n/**\n * @param {Node} newNode Node to replace old node\n * @param {Node} oldNode The node to be replaced\n */\nexport function replaceNode(newNode, oldNode) {\n const parent = oldNode.parentNode;\n if (parent) {\n parent.replaceChild(newNode, oldNode);\n }\n}\n\n/**\n * @param {Node} node The node to remove the children from.\n */\nexport function removeChildren(node) {\n while (node.lastChild) {\n node.lastChild.remove();\n }\n}\n\n/**\n * Transform the children of a parent node so they match the\n * provided list of children. This function aims to efficiently\n * remove, add, and reorder child nodes while maintaining a simple\n * implementation (it is not guaranteed to minimize DOM operations).\n * @param {Node} node The parent node whose children need reworking.\n * @param {Array} children The desired children.\n */\nexport function replaceChildren(node, children) {\n const oldChildren = node.childNodes;\n\n for (let i = 0; true; ++i) {\n const oldChild = oldChildren[i];\n const newChild = children[i];\n\n // check if our work is done\n if (!oldChild && !newChild) {\n break;\n }\n\n // check if children match\n if (oldChild === newChild) {\n continue;\n }\n\n // check if a new child needs to be added\n if (!oldChild) {\n node.appendChild(newChild);\n continue;\n }\n\n // check if an old child needs to be removed\n if (!newChild) {\n node.removeChild(oldChild);\n --i;\n continue;\n }\n\n // reorder\n node.insertBefore(newChild, oldChild);\n }\n}\n\n/**\n * Creates a minimal structure that mocks a DIV to be used by the composite and\n * layer renderer in a worker environment\n * @return {HTMLDivElement} mocked DIV\n */\nexport function createMockDiv() {\n const mockedDiv = new Proxy(\n {\n /**\n * @type {Array}\n */\n childNodes: [],\n /**\n * @param {HTMLElement} node html node.\n * @return {HTMLElement} html node.\n */\n appendChild: function (node) {\n this.childNodes.push(node);\n return node;\n },\n /**\n * dummy function, as this structure is not supposed to have a parent.\n */\n remove: function () {},\n /**\n * @param {HTMLElement} node html node.\n * @return {HTMLElement} html node.\n */\n removeChild: function (node) {\n const index = this.childNodes.indexOf(node);\n if (index === -1) {\n throw new Error('Node to remove was not found');\n }\n this.childNodes.splice(index, 1);\n return node;\n },\n /**\n * @param {HTMLElement} newNode new html node.\n * @param {HTMLElement} referenceNode reference html node.\n * @return {HTMLElement} new html node.\n */\n insertBefore: function (newNode, referenceNode) {\n const index = this.childNodes.indexOf(referenceNode);\n if (index === -1) {\n throw new Error('Reference node not found');\n }\n this.childNodes.splice(index, 0, newNode);\n return newNode;\n },\n style: {},\n },\n {\n get(target, prop, receiver) {\n if (prop === 'firstElementChild') {\n return target.childNodes.length > 0 ? target.childNodes[0] : null;\n }\n return Reflect.get(target, prop, receiver);\n },\n },\n );\n return /** @type {HTMLDivElement} */ (/** @type {*} */ (mockedDiv));\n}\n\n/***\n * @param {*} obj The object to check.\n * @return {obj is (HTMLCanvasElement | OffscreenCanvas)} The object is a canvas.\n */\nexport function isCanvas(obj) {\n return (\n (typeof HTMLCanvasElement !== 'undefined' &&\n obj instanceof HTMLCanvasElement) ||\n (typeof OffscreenCanvas !== 'undefined' && obj instanceof OffscreenCanvas)\n );\n}\n","/**\n * @module ol/control/Control\n */\nimport MapEventType from '../MapEventType.js';\nimport BaseObject from '../Object.js';\nimport {listen, unlistenByKey} from '../events.js';\nimport {VOID} from '../functions.js';\n\n/**\n * @typedef {Object} Options\n * @property {HTMLElement} [element] The element is the control's\n * container element. This only needs to be specified if you're developing\n * a custom control.\n * @property {function(import(\"../MapEvent.js\").default):void} [render] Function called when\n * the control should be re-rendered. This is called in a `requestAnimationFrame`\n * callback.\n * @property {HTMLElement|string} [target] Specify a target if you want\n * the control to be rendered outside of the map's viewport.\n */\n\n/**\n * @classdesc\n * A control is a visible widget with a DOM element in a fixed position on the\n * screen. They can involve user input (buttons), or be informational only;\n * the position is determined using CSS. By default these are placed in the\n * container with CSS class name `ol-overlaycontainer-stopevent`, but can use\n * any outside DOM element.\n *\n * This is the base class for controls. You can use it for simple custom\n * controls by creating the element with listeners, creating an instance:\n * ```js\n * const myControl = new Control({element: myElement});\n * ```\n * and then adding this to the map.\n *\n * The main advantage of having this as a control rather than a simple separate\n * DOM element is that preventing propagation is handled for you. Controls\n * will also be objects in a {@link module:ol/Collection~Collection}, so you can use their methods.\n *\n * You can also extend this base for your own control class. See\n * examples/custom-controls for an example of how to do this.\n *\n * @api\n */\nclass Control extends BaseObject {\n /**\n * @param {Options} options Control options.\n */\n constructor(options) {\n super();\n\n const element = options.element;\n if (element && !options.target && !element.style.pointerEvents) {\n element.style.pointerEvents = 'auto';\n }\n\n /**\n * @protected\n * @type {HTMLElement}\n */\n this.element = element ? element : null;\n\n /**\n * @private\n * @type {HTMLElement}\n */\n this.target_ = null;\n\n /**\n * @private\n * @type {import(\"../Map.js\").default|null}\n */\n this.map_ = null;\n\n /**\n * @protected\n * @type {!Array}\n */\n this.listenerKeys = [];\n\n if (options.render) {\n this.render = options.render;\n }\n\n if (options.target) {\n this.setTarget(options.target);\n }\n }\n\n /**\n * Clean up.\n * @override\n */\n disposeInternal() {\n this.element?.remove();\n super.disposeInternal();\n }\n\n /**\n * Get the map associated with this control.\n * @return {import(\"../Map.js\").default|null} Map.\n * @api\n */\n getMap() {\n return this.map_;\n }\n\n /**\n * Remove the control from its current map and attach it to the new map.\n * Pass `null` to just remove the control from the current map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default|null} map Map.\n * @api\n */\n setMap(map) {\n if (this.map_) {\n this.element?.remove();\n }\n for (let i = 0, ii = this.listenerKeys.length; i < ii; ++i) {\n unlistenByKey(this.listenerKeys[i]);\n }\n this.listenerKeys.length = 0;\n this.map_ = map;\n if (map) {\n const target = this.target_ ?? map.getOverlayContainerStopEvent();\n if (this.element) {\n target.appendChild(this.element);\n }\n if (this.render !== VOID) {\n this.listenerKeys.push(\n listen(map, MapEventType.POSTRENDER, this.render, this),\n );\n }\n map.render();\n }\n }\n\n /**\n * Renders the control.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @api\n */\n render(mapEvent) {}\n\n /**\n * This function is used to set a target element for the control. It has no\n * effect if it is called after the control has been added to the map (i.e.\n * after `setMap` is called on the control). If no `target` is set in the\n * options passed to the control constructor and if `setTarget` is not called\n * then the control is added to the map's overlay container.\n * @param {HTMLElement|string} target Target.\n * @api\n */\n setTarget(target) {\n this.target_ =\n typeof target === 'string' ? document.getElementById(target) : target;\n }\n}\n\nexport default Control;\n","/**\n * @module ol/control/Attribution\n */\nimport {equals} from '../array.js';\nimport {CLASS_COLLAPSED, CLASS_CONTROL, CLASS_UNSELECTABLE} from '../css.js';\nimport {removeChildren, replaceNode} from '../dom.js';\nimport EventType from '../events/EventType.js';\nimport {toPromise} from '../functions.js';\nimport Control from './Control.js';\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-attribution'] CSS class name.\n * @property {HTMLElement|string} [target] Specify a target if you\n * want the control to be rendered outside of the map's\n * viewport.\n * @property {boolean} [collapsible] Specify if attributions can\n * be collapsed. If not specified, sources control this behavior with their\n * `attributionsCollapsible` setting.\n * @property {boolean} [collapsed=true] Specify if attributions should\n * be collapsed at startup.\n * @property {string} [tipLabel='Attributions'] Text label to use for the button tip.\n * @property {string|HTMLElement} [label='i'] Text label to use for the\n * collapsed attributions button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [expandClassName=className + '-expand'] CSS class name for the\n * collapsed attributions button.\n * @property {string|HTMLElement} [collapseLabel='›'] Text label to use\n * for the expanded attributions button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [collapseClassName=className + '-collapse'] CSS class name for the\n * expanded attributions button.\n * @property {function(import(\"../MapEvent.js\").default):void} [render] Function called when\n * the control should be re-rendered. This is called in a `requestAnimationFrame`\n * callback.\n * @property {string|Array|undefined} [attributions] Optional attribution(s) that will always be\n * displayed regardless of the layers rendered.\n * **Caution:** Attributions are rendered dynamically using `innerHTML`, which can lead to potential\n * [**XSS (Cross-Site Scripting)**](https://en.wikipedia.org/wiki/Cross-site_scripting) vulnerabilities.\n * Use this feature only for trusted content\n * or ensure that the content is properly sanitized before inserting it.\n */\n\n/**\n * @classdesc\n * Control to show all the attributions associated with the layer sources\n * in the map. This control is one of the default controls included in maps.\n * By default it will show in the bottom right portion of the map, but this can\n * be changed by using a css selector for `.ol-attribution`.\n *\n * @api\n */\nclass Attribution extends Control {\n /**\n * @param {Options} [options] Attribution options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super({\n element: document.createElement('div'),\n render: options.render,\n target: options.target,\n });\n\n /**\n * @private\n * @type {HTMLElement}\n */\n this.ulElement_ = document.createElement('ul');\n\n /**\n * @private\n * @type {boolean}\n */\n this.collapsed_ =\n options.collapsed !== undefined ? options.collapsed : true;\n\n /**\n * @private\n * @type {boolean}\n */\n this.userCollapsed_ = this.collapsed_;\n\n /**\n * @private\n * @type {boolean}\n */\n this.overrideCollapsible_ = options.collapsible !== undefined;\n\n /**\n * @private\n * @type {boolean}\n */\n this.collapsible_ =\n options.collapsible !== undefined ? options.collapsible : true;\n\n if (!this.collapsible_) {\n this.collapsed_ = false;\n }\n\n /**\n * @private\n * @type {string | Array | undefined}\n */\n this.attributions_ = options.attributions;\n\n const className =\n options.className !== undefined ? options.className : 'ol-attribution';\n\n const tipLabel =\n options.tipLabel !== undefined ? options.tipLabel : 'Attributions';\n\n const expandClassName =\n options.expandClassName !== undefined\n ? options.expandClassName\n : className + '-expand';\n\n const collapseLabel =\n options.collapseLabel !== undefined ? options.collapseLabel : '\\u203A';\n\n const collapseClassName =\n options.collapseClassName !== undefined\n ? options.collapseClassName\n : className + '-collapse';\n\n if (typeof collapseLabel === 'string') {\n /**\n * @private\n * @type {HTMLElement}\n */\n this.collapseLabel_ = document.createElement('span');\n this.collapseLabel_.textContent = collapseLabel;\n this.collapseLabel_.className = collapseClassName;\n } else {\n this.collapseLabel_ = collapseLabel;\n }\n\n const label = options.label !== undefined ? options.label : 'i';\n\n if (typeof label === 'string') {\n /**\n * @private\n * @type {HTMLElement}\n */\n this.label_ = document.createElement('span');\n this.label_.textContent = label;\n this.label_.className = expandClassName;\n } else {\n this.label_ = label;\n }\n\n const activeLabel =\n this.collapsible_ && !this.collapsed_ ? this.collapseLabel_ : this.label_;\n\n /**\n * @private\n * @type {HTMLElement}\n */\n this.toggleButton_ = document.createElement('button');\n this.toggleButton_.setAttribute('type', 'button');\n this.toggleButton_.setAttribute('aria-expanded', String(!this.collapsed_));\n this.toggleButton_.title = tipLabel;\n this.toggleButton_.appendChild(activeLabel);\n\n this.toggleButton_.addEventListener(\n EventType.CLICK,\n this.handleClick_.bind(this),\n false,\n );\n\n const cssClasses =\n className +\n ' ' +\n CLASS_UNSELECTABLE +\n ' ' +\n CLASS_CONTROL +\n (this.collapsed_ && this.collapsible_ ? ' ' + CLASS_COLLAPSED : '') +\n (this.collapsible_ ? '' : ' ol-uncollapsible');\n const element = this.element;\n element.className = cssClasses;\n element.appendChild(this.toggleButton_);\n element.appendChild(this.ulElement_);\n\n /**\n * A list of currently rendered resolutions.\n * @type {Array}\n * @private\n */\n this.renderedAttributions_ = [];\n\n /**\n * @private\n * @type {boolean}\n */\n this.renderedVisible_ = true;\n }\n\n /**\n * Collect a list of visible attributions and set the collapsible state.\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @return {Array} Attributions.\n * @private\n */\n collectSourceAttributions_(frameState) {\n const layers = this.getMap().getAllLayers();\n const visibleAttributions = new Set(\n layers.flatMap((layer) => layer.getAttributions(frameState)),\n );\n if (this.attributions_ !== undefined) {\n Array.isArray(this.attributions_)\n ? this.attributions_.forEach((item) => visibleAttributions.add(item))\n : visibleAttributions.add(this.attributions_);\n }\n\n if (!this.overrideCollapsible_) {\n const collapsible = !layers.some(\n (layer) => layer.getSource()?.getAttributionsCollapsible() === false,\n );\n this.setCollapsible(collapsible);\n }\n return Array.from(visibleAttributions);\n }\n\n /**\n * @private\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n */\n async updateElement_(frameState) {\n if (!frameState) {\n if (this.renderedVisible_) {\n this.element.style.display = 'none';\n this.renderedVisible_ = false;\n }\n return;\n }\n\n const attributions = await Promise.all(\n this.collectSourceAttributions_(frameState).map((attribution) =>\n toPromise(() => attribution),\n ),\n );\n\n const visible = attributions.length > 0;\n if (this.renderedVisible_ != visible) {\n this.element.style.display = visible ? '' : 'none';\n this.renderedVisible_ = visible;\n }\n\n if (equals(attributions, this.renderedAttributions_)) {\n return;\n }\n\n removeChildren(this.ulElement_);\n\n // append the attributions\n for (let i = 0, ii = attributions.length; i < ii; ++i) {\n const element = document.createElement('li');\n element.innerHTML = attributions[i];\n this.ulElement_.appendChild(element);\n }\n\n this.renderedAttributions_ = attributions;\n }\n\n /**\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(event) {\n event.preventDefault();\n this.handleToggle_();\n this.userCollapsed_ = this.collapsed_;\n }\n\n /**\n * @private\n */\n handleToggle_() {\n this.element.classList.toggle(CLASS_COLLAPSED);\n if (this.collapsed_) {\n replaceNode(this.collapseLabel_, this.label_);\n } else {\n replaceNode(this.label_, this.collapseLabel_);\n }\n this.collapsed_ = !this.collapsed_;\n this.toggleButton_.setAttribute('aria-expanded', String(!this.collapsed_));\n }\n\n /**\n * Return `true` if the attribution is collapsible, `false` otherwise.\n * @return {boolean} True if the widget is collapsible.\n * @api\n */\n getCollapsible() {\n return this.collapsible_;\n }\n\n /**\n * Set whether the attribution should be collapsible.\n * @param {boolean} collapsible True if the widget is collapsible.\n * @api\n */\n setCollapsible(collapsible) {\n if (this.collapsible_ === collapsible) {\n return;\n }\n this.collapsible_ = collapsible;\n this.element.classList.toggle('ol-uncollapsible');\n if (this.userCollapsed_) {\n this.handleToggle_();\n }\n }\n\n /**\n * Collapse or expand the attribution according to the passed parameter. Will\n * not do anything if the attribution isn't collapsible or if the current\n * collapsed state is already the one requested.\n * @param {boolean} collapsed True if the widget is collapsed.\n * @api\n */\n setCollapsed(collapsed) {\n this.userCollapsed_ = collapsed;\n if (!this.collapsible_ || this.collapsed_ === collapsed) {\n return;\n }\n this.handleToggle_();\n }\n\n /**\n * Return `true` when the attribution is currently collapsed or `false`\n * otherwise.\n * @return {boolean} True if the widget is collapsed.\n * @api\n */\n getCollapsed() {\n return this.collapsed_;\n }\n\n /**\n * Update the attribution element.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @override\n */\n render(mapEvent) {\n this.updateElement_(mapEvent.frameState);\n }\n}\n\nexport default Attribution;\n","/**\n * @module ol/control/Rotate\n */\nimport {CLASS_CONTROL, CLASS_HIDDEN, CLASS_UNSELECTABLE} from '../css.js';\nimport {easeOut} from '../easing.js';\nimport EventType from '../events/EventType.js';\nimport Control from './Control.js';\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-rotate'] CSS class name.\n * @property {string|HTMLElement} [label='⇧'] Text label to use for the rotate button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [tipLabel='Reset rotation'] Text label to use for the rotate tip.\n * @property {string} [compassClassName='ol-compass'] CSS class name for the compass.\n * @property {number} [duration=250] Animation duration in milliseconds.\n * @property {boolean} [autoHide=true] Hide the control when rotation is 0.\n * @property {function(import(\"../MapEvent.js\").default):void} [render] Function called when the control should\n * be re-rendered. This is called in a `requestAnimationFrame` callback.\n * @property {function():void} [resetNorth] Function called when the control is clicked.\n * This will override the default `resetNorth`.\n * @property {HTMLElement|string} [target] Specify a target if you want the control to be\n * rendered outside of the map's viewport.\n */\n\n/**\n * @classdesc\n * A button control to reset rotation to 0.\n * To style this control use css selector `.ol-rotate`. A `.ol-hidden` css\n * selector is added to the button when the rotation is 0.\n *\n * @api\n */\nclass Rotate extends Control {\n /**\n * @param {Options} [options] Rotate options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super({\n element: document.createElement('div'),\n render: options.render,\n target: options.target,\n });\n\n const className =\n options.className !== undefined ? options.className : 'ol-rotate';\n\n const label = options.label !== undefined ? options.label : '\\u21E7';\n\n const compassClassName =\n options.compassClassName !== undefined\n ? options.compassClassName\n : 'ol-compass';\n\n /**\n * @type {HTMLElement}\n * @private\n */\n this.label_ = null;\n\n if (typeof label === 'string') {\n this.label_ = document.createElement('span');\n this.label_.className = compassClassName;\n this.label_.textContent = label;\n } else {\n this.label_ = label;\n this.label_.classList.add(compassClassName);\n }\n\n const tipLabel = options.tipLabel ? options.tipLabel : 'Reset rotation';\n\n const button = document.createElement('button');\n button.className = className + '-reset';\n button.setAttribute('type', 'button');\n button.title = tipLabel;\n button.appendChild(this.label_);\n\n button.addEventListener(\n EventType.CLICK,\n this.handleClick_.bind(this),\n false,\n );\n\n const cssClasses =\n className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL;\n const element = this.element;\n element.className = cssClasses;\n element.appendChild(button);\n\n /**\n * @private\n */\n this.callResetNorth_ = options.resetNorth ? options.resetNorth : undefined;\n\n /**\n * @type {number}\n * @private\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n\n /**\n * @type {boolean}\n * @private\n */\n this.autoHide_ = options.autoHide !== undefined ? options.autoHide : true;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.rotation_ = undefined;\n\n if (this.autoHide_) {\n this.element.classList.add(CLASS_HIDDEN);\n }\n }\n\n /**\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(event) {\n event.preventDefault();\n if (this.callResetNorth_ !== undefined) {\n this.callResetNorth_();\n } else {\n this.resetNorth_();\n }\n }\n\n /**\n * @private\n */\n resetNorth_() {\n const map = this.getMap();\n const view = map.getView();\n if (!view) {\n // the map does not have a view, so we can't act\n // upon it\n return;\n }\n const rotation = view.getRotation();\n if (rotation !== undefined) {\n if (this.duration_ > 0 && rotation % (2 * Math.PI) !== 0) {\n view.animate({\n rotation: 0,\n duration: this.duration_,\n easing: easeOut,\n });\n } else {\n view.setRotation(0);\n }\n }\n }\n\n /**\n * Update the rotate control element.\n * @param {import(\"../MapEvent.js\").default} mapEvent Map event.\n * @override\n */\n render(mapEvent) {\n const frameState = mapEvent.frameState;\n if (!frameState) {\n return;\n }\n const rotation = frameState.viewState.rotation;\n if (rotation != this.rotation_) {\n const transform = 'rotate(' + rotation + 'rad)';\n if (this.autoHide_) {\n const contains = this.element.classList.contains(CLASS_HIDDEN);\n if (!contains && rotation === 0) {\n this.element.classList.add(CLASS_HIDDEN);\n } else if (contains && rotation !== 0) {\n this.element.classList.remove(CLASS_HIDDEN);\n }\n }\n this.label_.style.transform = transform;\n }\n this.rotation_ = rotation;\n }\n}\n\nexport default Rotate;\n","/**\n * @module ol/control/Zoom\n */\nimport {CLASS_CONTROL, CLASS_UNSELECTABLE} from '../css.js';\nimport {easeOut} from '../easing.js';\nimport EventType from '../events/EventType.js';\nimport Control from './Control.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=250] Animation duration in milliseconds.\n * @property {string} [className='ol-zoom'] CSS class name.\n * @property {string} [zoomInClassName=className + '-in'] CSS class name for the zoom-in button.\n * @property {string} [zoomOutClassName=className + '-out'] CSS class name for the zoom-out button.\n * @property {string|HTMLElement} [zoomInLabel='+'] Text label to use for the zoom-in\n * button. Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string|HTMLElement} [zoomOutLabel='–'] Text label to use for the zoom-out button.\n * Instead of text, also an element (e.g. a `span` element) can be used.\n * @property {string} [zoomInTipLabel='Zoom in'] Text label to use for the button tip.\n * @property {string} [zoomOutTipLabel='Zoom out'] Text label to use for the button tip.\n * @property {number} [delta=1] The zoom delta applied on each click.\n * @property {HTMLElement|string} [target] Specify a target if you want the control to be\n * rendered outside of the map's viewport.\n */\n\n/**\n * @classdesc\n * A control with 2 buttons, one for zoom in and one for zoom out.\n * This control is one of the default controls of a map. To style this control\n * use css selectors `.ol-zoom-in` and `.ol-zoom-out`.\n *\n * @api\n */\nclass Zoom extends Control {\n /**\n * @param {Options} [options] Zoom options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super({\n element: document.createElement('div'),\n target: options.target,\n });\n\n const className =\n options.className !== undefined ? options.className : 'ol-zoom';\n\n const delta = options.delta !== undefined ? options.delta : 1;\n\n const zoomInClassName =\n options.zoomInClassName !== undefined\n ? options.zoomInClassName\n : className + '-in';\n\n const zoomOutClassName =\n options.zoomOutClassName !== undefined\n ? options.zoomOutClassName\n : className + '-out';\n\n const zoomInLabel =\n options.zoomInLabel !== undefined ? options.zoomInLabel : '+';\n const zoomOutLabel =\n options.zoomOutLabel !== undefined ? options.zoomOutLabel : '\\u2013';\n\n const zoomInTipLabel =\n options.zoomInTipLabel !== undefined ? options.zoomInTipLabel : 'Zoom in';\n const zoomOutTipLabel =\n options.zoomOutTipLabel !== undefined\n ? options.zoomOutTipLabel\n : 'Zoom out';\n\n const inElement = document.createElement('button');\n inElement.className = zoomInClassName;\n inElement.setAttribute('type', 'button');\n inElement.title = zoomInTipLabel;\n inElement.appendChild(\n typeof zoomInLabel === 'string'\n ? document.createTextNode(zoomInLabel)\n : zoomInLabel,\n );\n\n inElement.addEventListener(\n EventType.CLICK,\n this.handleClick_.bind(this, delta),\n false,\n );\n\n const outElement = document.createElement('button');\n outElement.className = zoomOutClassName;\n outElement.setAttribute('type', 'button');\n outElement.title = zoomOutTipLabel;\n outElement.appendChild(\n typeof zoomOutLabel === 'string'\n ? document.createTextNode(zoomOutLabel)\n : zoomOutLabel,\n );\n\n outElement.addEventListener(\n EventType.CLICK,\n this.handleClick_.bind(this, -delta),\n false,\n );\n\n const cssClasses =\n className + ' ' + CLASS_UNSELECTABLE + ' ' + CLASS_CONTROL;\n const element = this.element;\n element.className = cssClasses;\n element.appendChild(inElement);\n element.appendChild(outElement);\n\n /**\n * @type {number}\n * @private\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n }\n\n /**\n * @param {number} delta Zoom delta.\n * @param {MouseEvent} event The event to handle\n * @private\n */\n handleClick_(delta, event) {\n event.preventDefault();\n this.zoomByDelta_(delta);\n }\n\n /**\n * @param {number} delta Zoom delta.\n * @private\n */\n zoomByDelta_(delta) {\n const map = this.getMap();\n const view = map.getView();\n if (!view) {\n // the map does not have a view, so we can't act\n // upon it\n return;\n }\n const currentZoom = view.getZoom();\n if (currentZoom !== undefined) {\n const newZoom = view.getConstrainedZoom(currentZoom + delta);\n if (this.duration_ > 0) {\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n view.animate({\n zoom: newZoom,\n duration: this.duration_,\n easing: easeOut,\n });\n } else {\n view.setZoom(newZoom);\n }\n }\n }\n}\n\nexport default Zoom;\n","/**\n * @module ol/control/defaults\n */\nimport Collection from '../Collection.js';\nimport Attribution from './Attribution.js';\nimport Rotate from './Rotate.js';\nimport Zoom from './Zoom.js';\n\n/**\n * @typedef {Object} DefaultsOptions\n * @property {boolean} [attribution=true] Include\n * {@link module:ol/control/Attribution~Attribution}.\n * @property {import(\"./Attribution.js\").Options} [attributionOptions]\n * Options for {@link module:ol/control/Attribution~Attribution}.\n * @property {boolean} [rotate=true] Include\n * {@link module:ol/control/Rotate~Rotate}.\n * @property {import(\"./Rotate.js\").Options} [rotateOptions] Options\n * for {@link module:ol/control/Rotate~Rotate}.\n * @property {boolean} [zoom] Include {@link module:ol/control/Zoom~Zoom}.\n * @property {import(\"./Zoom.js\").Options} [zoomOptions] Options for\n * {@link module:ol/control/Zoom~Zoom}.\n */\n\n/**\n * Set of controls included in maps by default. Unless configured otherwise,\n * this returns a collection containing an instance of each of the following\n * controls:\n * {@link module:ol/control/Zoom~Zoom}\n * {@link module:ol/control/Rotate~Rotate}\n * {@link module:ol/control/Attribution~Attribution}\n *\n * @param {DefaultsOptions} [options] Options for the default controls.\n * @return {Collection} A collection of controls\n * to be used with the {@link module:ol/Map~Map} constructor's `controls` option.\n * @api\n */\nexport function defaults(options) {\n options = options ? options : {};\n\n /** @type {Collection} */\n const controls = new Collection();\n\n const zoomControl = options.zoom !== undefined ? options.zoom : true;\n if (zoomControl) {\n controls.push(new Zoom(options.zoomOptions));\n }\n\n const rotateControl = options.rotate !== undefined ? options.rotate : true;\n if (rotateControl) {\n controls.push(new Rotate(options.rotateOptions));\n }\n\n const attributionControl =\n options.attribution !== undefined ? options.attribution : true;\n if (attributionControl) {\n controls.push(new Attribution(options.attributionOptions));\n }\n\n return controls;\n}\n","/**\n * @module ol/Kinetic\n */\n\n/**\n * @classdesc\n * Implementation of inertial deceleration for map movement.\n *\n * @api\n */\nclass Kinetic {\n /**\n * @param {number} decay Rate of decay (must be negative).\n * @param {number} minVelocity Minimum velocity (pixels/millisecond).\n * @param {number} delay Delay to consider to calculate the kinetic\n * initial values (milliseconds).\n */\n constructor(decay, minVelocity, delay) {\n /**\n * @private\n * @type {number}\n */\n this.decay_ = decay;\n\n /**\n * @private\n * @type {number}\n */\n this.minVelocity_ = minVelocity;\n\n /**\n * @private\n * @type {number}\n */\n this.delay_ = delay;\n\n /**\n * @private\n * @type {Array}\n */\n this.points_ = [];\n\n /**\n * @private\n * @type {number}\n */\n this.angle_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.initialVelocity_ = 0;\n }\n\n /**\n * FIXME empty description for jsdoc\n */\n begin() {\n this.points_.length = 0;\n this.angle_ = 0;\n this.initialVelocity_ = 0;\n }\n\n /**\n * @param {number} x X.\n * @param {number} y Y.\n */\n update(x, y) {\n this.points_.push(x, y, Date.now());\n }\n\n /**\n * @return {boolean} Whether we should do kinetic animation.\n */\n end() {\n if (this.points_.length < 6) {\n // at least 2 points are required (i.e. there must be at least 6 elements\n // in the array)\n return false;\n }\n const delay = Date.now() - this.delay_;\n const lastIndex = this.points_.length - 3;\n if (this.points_[lastIndex + 2] < delay) {\n // the last tracked point is too old, which means that the user stopped\n // panning before releasing the map\n return false;\n }\n\n // get the first point which still falls into the delay time\n let firstIndex = lastIndex - 3;\n while (firstIndex > 0 && this.points_[firstIndex + 2] > delay) {\n firstIndex -= 3;\n }\n\n const duration = this.points_[lastIndex + 2] - this.points_[firstIndex + 2];\n // we don't want a duration of 0 (divide by zero)\n // we also make sure the user panned for a duration of at least one frame\n // (1/60s) to compute sane displacement values\n if (duration < 1000 / 60) {\n return false;\n }\n\n const dx = this.points_[lastIndex] - this.points_[firstIndex];\n const dy = this.points_[lastIndex + 1] - this.points_[firstIndex + 1];\n this.angle_ = Math.atan2(dy, dx);\n this.initialVelocity_ = Math.sqrt(dx * dx + dy * dy) / duration;\n return this.initialVelocity_ > this.minVelocity_;\n }\n\n /**\n * @return {number} Total distance travelled (pixels).\n */\n getDistance() {\n return (this.minVelocity_ - this.initialVelocity_) / this.decay_;\n }\n\n /**\n * @return {number} Angle of the kinetic panning animation (radians).\n */\n getAngle() {\n return this.angle_;\n }\n}\n\nexport default Kinetic;\n","/**\n * @module ol/interaction/Property\n */\n\n/**\n * @enum {string}\n */\nexport default {\n ACTIVE: 'active',\n};\n","/**\n * @module ol/interaction/Interaction\n */\nimport BaseObject from '../Object.js';\nimport {easeOut, linear} from '../easing.js';\nimport InteractionProperty from './Property.js';\n\n/***\n * @template Return\n * @typedef {import(\"../Observable.js\").OnSignature &\n * import(\"../Observable.js\").OnSignature &\n * import(\"../Observable.js\").CombinedOnSignature} InteractionOnSignature\n */\n\n/**\n * Object literal with config options for interactions.\n * @typedef {Object} InteractionOptions\n * @property {function(import(\"../MapBrowserEvent.js\").default):boolean} [handleEvent]\n * Method called by the map to notify the interaction that a browser event was\n * dispatched to the map. If the function returns a falsy value, propagation of\n * the event to other interactions in the map's interactions chain will be\n * prevented (this includes functions with no explicit return). The interactions\n * are traversed in reverse order of the interactions collection of the map.\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * User actions that change the state of the map. Some are similar to controls,\n * but are not associated with a DOM element.\n * For example, {@link module:ol/interaction/KeyboardZoom~KeyboardZoom} is\n * functionally the same as {@link module:ol/control/Zoom~Zoom}, but triggered\n * by a keyboard event not a button element event.\n * Although interactions do not have a DOM element, some of them do render\n * vectors and so are visible on the screen.\n * @api\n */\nclass Interaction extends BaseObject {\n /**\n * @param {InteractionOptions} [options] Options.\n */\n constructor(options) {\n super();\n\n /***\n * @type {InteractionOnSignature}\n */\n this.on;\n\n /***\n * @type {InteractionOnSignature}\n */\n this.once;\n\n /***\n * @type {InteractionOnSignature}\n */\n this.un;\n\n if (options && options.handleEvent) {\n this.handleEvent = options.handleEvent;\n }\n\n /**\n * @private\n * @type {import(\"../Map.js\").default|null}\n */\n this.map_ = null;\n\n this.setActive(true);\n }\n\n /**\n * Return whether the interaction is currently active.\n * @return {boolean} `true` if the interaction is active, `false` otherwise.\n * @observable\n * @api\n */\n getActive() {\n return /** @type {boolean} */ (this.get(InteractionProperty.ACTIVE));\n }\n\n /**\n * Get the map associated with this interaction.\n * @return {import(\"../Map.js\").default|null} Map.\n * @api\n */\n getMap() {\n return this.map_;\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event}.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @api\n */\n handleEvent(mapBrowserEvent) {\n return true;\n }\n\n /**\n * Activate or deactivate the interaction.\n * @param {boolean} active Active.\n * @observable\n * @api\n */\n setActive(active) {\n this.set(InteractionProperty.ACTIVE, active);\n }\n\n /**\n * Remove the interaction from its current map and attach it to the new map.\n * Subclasses may set up event handlers to get notified about changes to\n * the map here.\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMap(map) {\n this.map_ = map;\n }\n}\n\n/**\n * @param {import(\"../View.js\").default} view View.\n * @param {import(\"../coordinate.js\").Coordinate} delta Delta.\n * @param {number} [duration] Duration.\n */\nexport function pan(view, delta, duration) {\n const currentCenter = view.getCenterInternal();\n if (currentCenter) {\n const center = [currentCenter[0] + delta[0], currentCenter[1] + delta[1]];\n view.animateInternal({\n duration: duration !== undefined ? duration : 250,\n easing: linear,\n center: view.getConstrainedCenter(center),\n });\n }\n}\n\n/**\n * @param {import(\"../View.js\").default} view View.\n * @param {number} delta Delta from previous zoom level.\n * @param {import(\"../coordinate.js\").Coordinate} [anchor] Anchor coordinate in the user projection.\n * @param {number} [duration] Duration.\n */\nexport function zoomByDelta(view, delta, anchor, duration) {\n const currentZoom = view.getZoom();\n\n if (currentZoom === undefined) {\n return;\n }\n\n const newZoom = view.getConstrainedZoom(currentZoom + delta);\n const newResolution = view.getResolutionForZoom(newZoom);\n\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n view.animate({\n resolution: newResolution,\n anchor: anchor,\n duration: duration !== undefined ? duration : 250,\n easing: easeOut,\n });\n}\n\nexport default Interaction;\n","/**\n * @module ol/interaction/DoubleClickZoom\n */\nimport MapBrowserEventType from '../MapBrowserEventType.js';\nimport Interaction, {zoomByDelta} from './Interaction.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=250] Animation duration in milliseconds.\n * @property {number} [delta=1] The zoom delta applied on each double click.\n */\n\n/**\n * @classdesc\n * Allows the user to zoom by double-clicking on the map.\n * @api\n */\nclass DoubleClickZoom extends Interaction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super();\n\n options = options ? options : {};\n\n /**\n * @private\n * @type {number}\n */\n this.delta_ = options.delta ? options.delta : 1;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} (if it was a\n * doubleclick) and eventually zooms the map.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @override\n */\n handleEvent(mapBrowserEvent) {\n let stopEvent = false;\n if (mapBrowserEvent.type == MapBrowserEventType.DBLCLICK) {\n const browserEvent = /** @type {MouseEvent} */ (\n mapBrowserEvent.originalEvent\n );\n const map = mapBrowserEvent.map;\n const anchor = mapBrowserEvent.coordinate;\n const delta = browserEvent.shiftKey ? -this.delta_ : this.delta_;\n const view = map.getView();\n zoomByDelta(view, delta, anchor, this.duration_);\n browserEvent.preventDefault();\n stopEvent = true;\n }\n return !stopEvent;\n }\n}\n\nexport default DoubleClickZoom;\n","/**\n * @module ol/events/condition\n */\nimport MapBrowserEventType from '../MapBrowserEventType.js';\nimport {FALSE, TRUE} from '../functions.js';\nimport {MAC, WEBKIT} from '../has.js';\n\n/**\n * A function that takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * `{boolean}`. If the condition is met, true should be returned.\n *\n * @typedef {function(this: ?, import(\"../MapBrowserEvent.js\").default): boolean} Condition\n */\n\n/**\n * Creates a condition function that passes when all provided conditions pass.\n * @param {...Condition} var_args Conditions to check.\n * @return {Condition} Condition function.\n */\nexport function all(var_args) {\n const conditions = arguments;\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n * @return {boolean} All conditions passed.\n */\n return function (event) {\n let pass = true;\n for (let i = 0, ii = conditions.length; i < ii; ++i) {\n pass = pass && conditions[i](event);\n if (!pass) {\n break;\n }\n }\n return pass;\n };\n}\n\n/**\n * Return `true` if only the alt-key is pressed, `false` otherwise (e.g. when\n * additionally the shift-key is pressed).\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the alt key is pressed.\n * @api\n */\nexport const altKeyOnly = function (mapBrowserEvent) {\n const originalEvent = mapBrowserEvent.originalEvent;\n return (\n originalEvent.altKey &&\n !(originalEvent.metaKey || originalEvent.ctrlKey) &&\n !originalEvent.shiftKey\n );\n};\n\n/**\n * Return `true` if only the alt-key and shift-key is pressed, `false` otherwise\n * (e.g. when additionally the platform-modifier-key is pressed).\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the alt and shift keys are pressed.\n * @api\n */\nexport const altShiftKeysOnly = function (mapBrowserEvent) {\n const originalEvent = mapBrowserEvent.originalEvent;\n return (\n originalEvent.altKey &&\n !(originalEvent.metaKey || originalEvent.ctrlKey) &&\n originalEvent.shiftKey\n );\n};\n\n/**\n * Return `true` if the map has the focus. This condition requires a map target\n * element with a `tabindex` attribute, e.g. `
`.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} event Map browser event.\n * @return {boolean} The map has the focus.\n * @api\n */\nexport const focus = function (event) {\n const targetElement = event.map.getTargetElement();\n const rootNode = targetElement.getRootNode();\n const activeElement = event.map.getOwnerDocument().activeElement;\n\n return rootNode instanceof ShadowRoot\n ? rootNode.host.contains(activeElement)\n : targetElement.contains(activeElement);\n};\n\n/**\n * Return `true` if the map has the focus or no 'tabindex' attribute set.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} event Map browser event.\n * @return {boolean} The map container has the focus or no 'tabindex' attribute.\n */\nexport const focusWithTabindex = function (event) {\n const targetElement = event.map.getTargetElement();\n const rootNode = targetElement.getRootNode();\n const tabIndexCandidate =\n rootNode instanceof ShadowRoot ? rootNode.host : targetElement;\n\n return tabIndexCandidate.hasAttribute('tabindex') ? focus(event) : true;\n};\n\n/**\n * Return always true.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True.\n * @api\n */\nexport const always = TRUE;\n\n/**\n * Return `true` if the event is a `click` event, `false` otherwise.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event is a map `click` event.\n * @api\n */\nexport const click = function (mapBrowserEvent) {\n return mapBrowserEvent.type == MapBrowserEventType.CLICK;\n};\n\n/**\n * Return `true` if the event has an \"action\"-producing mouse button.\n *\n * By definition, this includes left-click on windows/linux, and left-click\n * without the ctrl key on Macs.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} The result.\n */\nexport const mouseActionButton = function (mapBrowserEvent) {\n const originalEvent = mapBrowserEvent.originalEvent;\n return (\n 'pointerId' in originalEvent &&\n originalEvent.button == 0 &&\n !(WEBKIT && MAC && originalEvent.ctrlKey)\n );\n};\n\n/**\n * Return always false.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} False.\n * @api\n */\nexport const never = FALSE;\n\n/**\n * Return `true` if the browser event is a `pointermove` event, `false`\n * otherwise.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the browser event is a `pointermove` event.\n * @api\n */\nexport const pointerMove = function (mapBrowserEvent) {\n return mapBrowserEvent.type == 'pointermove';\n};\n\n/**\n * Return `true` if the event is a map `singleclick` event, `false` otherwise.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event is a map `singleclick` event.\n * @api\n */\nexport const singleClick = function (mapBrowserEvent) {\n return mapBrowserEvent.type == MapBrowserEventType.SINGLECLICK;\n};\n\n/**\n * Return `true` if the event is a map `dblclick` event, `false` otherwise.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event is a map `dblclick` event.\n * @api\n */\nexport const doubleClick = function (mapBrowserEvent) {\n return mapBrowserEvent.type == MapBrowserEventType.DBLCLICK;\n};\n\n/**\n * Return `true` if no modifier key (alt-, shift- or platform-modifier-key) is\n * pressed.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True only if there no modifier keys are pressed.\n * @api\n */\nexport const noModifierKeys = function (mapBrowserEvent) {\n const originalEvent = /** @type {KeyboardEvent|MouseEvent|TouchEvent} */ (\n mapBrowserEvent.originalEvent\n );\n return (\n !originalEvent.altKey &&\n !(originalEvent.metaKey || originalEvent.ctrlKey) &&\n !originalEvent.shiftKey\n );\n};\n\n/**\n * Return `true` if only the platform-modifier-key (the meta-key on Mac,\n * ctrl-key otherwise) is pressed, `false` otherwise (e.g. when additionally\n * the shift-key is pressed).\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the platform modifier key is pressed.\n * @api\n */\nexport const platformModifierKeyOnly = function (mapBrowserEvent) {\n const originalEvent = mapBrowserEvent.originalEvent;\n return (\n !originalEvent.altKey &&\n (MAC ? originalEvent.metaKey : originalEvent.ctrlKey) &&\n !originalEvent.shiftKey\n );\n};\n\n/**\n * Return `true` if the platform-modifier-key (the meta-key on Mac,\n * ctrl-key otherwise) is pressed.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the platform modifier key is pressed.\n * @api\n */\nexport const platformModifierKey = function (mapBrowserEvent) {\n const originalEvent = mapBrowserEvent.originalEvent;\n return MAC ? originalEvent.metaKey : originalEvent.ctrlKey;\n};\n\n/**\n * Return `true` if only the shift-key is pressed, `false` otherwise (e.g. when\n * additionally the alt-key is pressed).\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if only the shift key is pressed.\n * @api\n */\nexport const shiftKeyOnly = function (mapBrowserEvent) {\n const originalEvent = mapBrowserEvent.originalEvent;\n return (\n !originalEvent.altKey &&\n !(originalEvent.metaKey || originalEvent.ctrlKey) &&\n originalEvent.shiftKey\n );\n};\n\n/**\n * Return `true` if the target element is not editable, i.e. not an `input`,\n * `select`, or `textarea` element and no `contenteditable` attribute is\n * set or inherited, `false` otherwise.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True only if the target element is not editable.\n * @api\n */\nexport const targetNotEditable = function (mapBrowserEvent) {\n const originalEvent = mapBrowserEvent.originalEvent;\n const tagName = /** @type {Element} */ (originalEvent.target).tagName;\n return (\n tagName !== 'INPUT' &&\n tagName !== 'SELECT' &&\n tagName !== 'TEXTAREA' &&\n // `isContentEditable` is only available on `HTMLElement`, but it may also be a\n // different type like `SVGElement`.\n // @ts-ignore\n !originalEvent.target.isContentEditable\n );\n};\n\n/**\n * Return `true` if the event originates from a mouse device.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event originates from a mouse device.\n * @api\n */\nexport const mouseOnly = function (mapBrowserEvent) {\n const pointerEvent = mapBrowserEvent.originalEvent;\n // see https://www.w3.org/TR/pointerevents/#widl-PointerEvent-pointerType\n return 'pointerId' in pointerEvent && pointerEvent.pointerType == 'mouse';\n};\n\n/**\n * Return `true` if the event originates from a touchable device.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event originates from a touchable device.\n * @api\n */\nexport const touchOnly = function (mapBrowserEvent) {\n const pointerEvt = mapBrowserEvent.originalEvent;\n // see https://www.w3.org/TR/pointerevents/#widl-PointerEvent-pointerType\n return 'pointerId' in pointerEvt && pointerEvt.pointerType === 'touch';\n};\n\n/**\n * Return `true` if the event originates from a digital pen.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event originates from a digital pen.\n * @api\n */\nexport const penOnly = function (mapBrowserEvent) {\n const pointerEvt = mapBrowserEvent.originalEvent;\n // see https://www.w3.org/TR/pointerevents/#widl-PointerEvent-pointerType\n return 'pointerId' in pointerEvt && pointerEvt.pointerType === 'pen';\n};\n\n/**\n * Return `true` if the event originates from a primary pointer in\n * contact with the surface or if the left mouse button is pressed.\n * See https://www.w3.org/TR/pointerevents/#button-states.\n *\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} True if the event originates from a primary pointer.\n * @api\n */\nexport const primaryAction = function (mapBrowserEvent) {\n const pointerEvent = mapBrowserEvent.originalEvent;\n return (\n 'pointerId' in pointerEvent &&\n pointerEvent.isPrimary &&\n pointerEvent.button === 0\n );\n};\n","/**\n * @module ol/interaction/Pointer\n */\nimport MapBrowserEventType from '../MapBrowserEventType.js';\nimport Interaction from './Interaction.js';\n\n/**\n * @typedef {Object} Options\n * @property {function(import(\"../MapBrowserEvent.js\").default):boolean} [handleDownEvent]\n * Function handling \"down\" events. If the function returns `true` then a drag\n * sequence is started.\n * @property {function(import(\"../MapBrowserEvent.js\").default):void} [handleDragEvent]\n * Function handling \"drag\" events. This function is called on \"move\" events\n * during a drag sequence.\n * @property {function(import(\"../MapBrowserEvent.js\").default):boolean} [handleEvent]\n * Method called by the map to notify the interaction that a browser event was\n * dispatched to the map. The function may return `false` to prevent the\n * propagation of the event to other interactions in the map's interactions\n * chain.\n * @property {function(import(\"../MapBrowserEvent.js\").default):void} [handleMoveEvent]\n * Function handling \"move\" events. This function is called on \"move\" events.\n * This functions is also called during a drag sequence, so during a drag\n * sequence both the `handleDragEvent` function and this function are called.\n * If `handleDownEvent` is defined and it returns true this function will not\n * be called during a drag sequence.\n * @property {function(import(\"../MapBrowserEvent.js\").default):boolean} [handleUpEvent]\n * Function handling \"up\" events. If the function returns `false` then the\n * current drag sequence is stopped.\n * @property {function(boolean):boolean} [stopDown]\n * Should the down event be propagated to other interactions, or should be\n * stopped?\n */\n\n/**\n * @classdesc\n * Base class that calls user-defined functions on `down`, `move` and `up`\n * events. This class also manages \"drag sequences\".\n *\n * When the `handleDownEvent` user function returns `true` a drag sequence is\n * started. During a drag sequence the `handleDragEvent` user function is\n * called on `move` events. The drag sequence ends when the `handleUpEvent`\n * user function is called and returns `false`.\n * @api\n */\nclass PointerInteraction extends Interaction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super(\n /** @type {import(\"./Interaction.js\").InteractionOptions} */ (options),\n );\n\n if (options.handleDownEvent) {\n this.handleDownEvent = options.handleDownEvent;\n }\n\n if (options.handleDragEvent) {\n this.handleDragEvent = options.handleDragEvent;\n }\n\n if (options.handleMoveEvent) {\n this.handleMoveEvent = options.handleMoveEvent;\n }\n\n if (options.handleUpEvent) {\n this.handleUpEvent = options.handleUpEvent;\n }\n\n if (options.stopDown) {\n this.stopDown = options.stopDown;\n }\n\n /**\n * @type {boolean}\n * @protected\n */\n this.handlingDownUpSequence = false;\n\n /**\n * @type {Array}\n * @protected\n */\n this.targetPointers = [];\n }\n\n /**\n * Returns the current number of pointers involved in the interaction,\n * e.g. `2` when two fingers are used.\n * @return {number} The number of pointers.\n * @api\n */\n getPointerCount() {\n return this.targetPointers.length;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @protected\n */\n handleDownEvent(mapBrowserEvent) {\n return false;\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @protected\n */\n handleDragEvent(mapBrowserEvent) {}\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} and may call into\n * other functions, if event sequences like e.g. 'drag' or 'down-up' etc. are\n * detected.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @api\n * @override\n */\n handleEvent(mapBrowserEvent) {\n if (!mapBrowserEvent.originalEvent) {\n return true;\n }\n\n let stopEvent = false;\n this.updateTrackedPointers_(mapBrowserEvent);\n if (this.handlingDownUpSequence) {\n if (mapBrowserEvent.type == MapBrowserEventType.POINTERDRAG) {\n this.handleDragEvent(mapBrowserEvent);\n // prevent page scrolling during dragging\n mapBrowserEvent.originalEvent.preventDefault();\n } else if (mapBrowserEvent.type == MapBrowserEventType.POINTERUP) {\n const handledUp = this.handleUpEvent(mapBrowserEvent);\n this.handlingDownUpSequence =\n handledUp && this.targetPointers.length > 0;\n }\n } else {\n if (mapBrowserEvent.type == MapBrowserEventType.POINTERDOWN) {\n const handled = this.handleDownEvent(mapBrowserEvent);\n this.handlingDownUpSequence = handled;\n stopEvent = this.stopDown(handled);\n } else if (mapBrowserEvent.type == MapBrowserEventType.POINTERMOVE) {\n this.handleMoveEvent(mapBrowserEvent);\n }\n }\n return !stopEvent;\n }\n\n /**\n * Handle pointer move events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @protected\n */\n handleMoveEvent(mapBrowserEvent) {}\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @protected\n */\n handleUpEvent(mapBrowserEvent) {\n return false;\n }\n\n /**\n * This function is used to determine if \"down\" events should be propagated\n * to other interactions or should be stopped.\n * @param {boolean} handled Was the event handled by the interaction?\n * @return {boolean} Should the `down` event be stopped?\n */\n stopDown(handled) {\n return handled;\n }\n\n /**\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @private\n */\n updateTrackedPointers_(mapBrowserEvent) {\n if (mapBrowserEvent.activePointers) {\n this.targetPointers = mapBrowserEvent.activePointers;\n }\n }\n}\n\n/**\n * @param {Array} pointerEvents List of events.\n * @return {{clientX: number, clientY: number}} Centroid pixel.\n */\nexport function centroid(pointerEvents) {\n const length = pointerEvents.length;\n let clientX = 0;\n let clientY = 0;\n for (let i = 0; i < length; i++) {\n clientX += pointerEvents[i].clientX;\n clientY += pointerEvents[i].clientY;\n }\n return {clientX: clientX / length, clientY: clientY / length};\n}\n\nexport default PointerInteraction;\n","/**\n * @module ol/interaction/DragPan\n */\nimport {\n rotate as rotateCoordinate,\n scale as scaleCoordinate,\n} from '../coordinate.js';\nimport {easeOut} from '../easing.js';\nimport {\n all,\n focusWithTabindex,\n noModifierKeys,\n primaryAction,\n} from '../events/condition.js';\nimport {FALSE} from '../functions.js';\nimport PointerInteraction, {\n centroid as centroidFromPointers,\n} from './Pointer.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a boolean\n * to indicate whether that event should be handled.\n * Default is {@link module:ol/events/condition.noModifierKeys} and {@link module:ol/events/condition.primaryAction}.\n * @property {boolean} [onFocusOnly=false] When the map's target has a `tabindex` attribute set,\n * the interaction will only handle events when the map has the focus.\n * @property {import(\"../Kinetic.js\").default} [kinetic] Kinetic inertia to apply to the pan.\n */\n\n/**\n * @classdesc\n * Allows the user to pan the map by dragging the map.\n * @api\n */\nclass DragPan extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super({\n stopDown: FALSE,\n });\n\n options = options ? options : {};\n\n /**\n * @private\n * @type {import(\"../Kinetic.js\").default|undefined}\n */\n this.kinetic_ = options.kinetic;\n\n /**\n * @type {import(\"../pixel.js\").Pixel}\n */\n this.lastCentroid = null;\n\n /**\n * @type {number}\n * @private\n */\n this.lastPointersCount_;\n\n /**\n * @type {boolean}\n * @private\n */\n this.panning_ = false;\n\n const condition = options.condition\n ? options.condition\n : all(noModifierKeys, primaryAction);\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.onFocusOnly\n ? all(focusWithTabindex, condition)\n : condition;\n\n /**\n * @private\n * @type {boolean}\n */\n this.noKinetic_ = false;\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @override\n */\n handleDragEvent(mapBrowserEvent) {\n const map = mapBrowserEvent.map;\n if (!this.panning_) {\n this.panning_ = true;\n map.getView().beginInteraction();\n }\n const targetPointers = this.targetPointers;\n const centroid = map.getEventPixel(centroidFromPointers(targetPointers));\n if (targetPointers.length == this.lastPointersCount_) {\n if (this.kinetic_) {\n this.kinetic_.update(centroid[0], centroid[1]);\n }\n if (this.lastCentroid) {\n const delta = [\n this.lastCentroid[0] - centroid[0],\n centroid[1] - this.lastCentroid[1],\n ];\n const map = mapBrowserEvent.map;\n const view = map.getView();\n scaleCoordinate(delta, view.getResolution());\n rotateCoordinate(delta, view.getRotation());\n view.adjustCenterInternal(delta);\n }\n } else if (this.kinetic_) {\n // reset so we don't overestimate the kinetic energy after\n // after one finger down, tiny drag, second finger down\n this.kinetic_.begin();\n }\n this.lastCentroid = centroid;\n this.lastPointersCount_ = targetPointers.length;\n mapBrowserEvent.originalEvent.preventDefault();\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleUpEvent(mapBrowserEvent) {\n const map = mapBrowserEvent.map;\n const view = map.getView();\n if (this.targetPointers.length === 0) {\n if (!this.noKinetic_ && this.kinetic_ && this.kinetic_.end()) {\n const distance = this.kinetic_.getDistance();\n const angle = this.kinetic_.getAngle();\n const center = view.getCenterInternal();\n const centerpx = map.getPixelFromCoordinateInternal(center);\n const dest = map.getCoordinateFromPixelInternal([\n centerpx[0] - distance * Math.cos(angle),\n centerpx[1] - distance * Math.sin(angle),\n ]);\n view.animateInternal({\n center: view.getConstrainedCenter(dest),\n duration: 500,\n easing: easeOut,\n });\n }\n if (this.panning_) {\n this.panning_ = false;\n view.endInteraction();\n }\n return false;\n }\n if (this.kinetic_) {\n // reset so we don't overestimate the kinetic energy after\n // after one finger up, tiny drag, second finger up\n this.kinetic_.begin();\n }\n this.lastCentroid = null;\n return true;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleDownEvent(mapBrowserEvent) {\n if (this.targetPointers.length > 0 && this.condition_(mapBrowserEvent)) {\n const map = mapBrowserEvent.map;\n const view = map.getView();\n this.lastCentroid = null;\n // stop any current animation\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n if (this.kinetic_) {\n this.kinetic_.begin();\n }\n // No kinetic as soon as more than one pointer on the screen is\n // detected. This is to prevent nasty pans after pinch.\n this.noKinetic_ = this.targetPointers.length > 1;\n return true;\n }\n return false;\n }\n}\n\nexport default DragPan;\n","/**\n * @module ol/interaction/DragRotate\n */\nimport {\n altShiftKeysOnly,\n mouseActionButton,\n mouseOnly,\n} from '../events/condition.js';\nimport {FALSE} from '../functions.js';\nimport {disable} from '../rotationconstraint.js';\nimport PointerInteraction from './Pointer.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that takes a\n * {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a boolean\n * to indicate whether that event should be handled.\n * Default is {@link module:ol/events/condition.altShiftKeysOnly}.\n * @property {number} [duration=250] Animation duration in milliseconds.\n */\n\n/**\n * @classdesc\n * Allows the user to rotate the map by clicking and dragging on the map,\n * normally combined with a {@link module:ol/events/condition} that limits\n * it to when the alt and shift keys are held down.\n *\n * This interaction is only supported for mouse devices.\n * @api\n */\nclass DragRotate extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super({\n stopDown: FALSE,\n });\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.condition ? options.condition : altShiftKeysOnly;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.lastAngle_ = undefined;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @override\n */\n handleDragEvent(mapBrowserEvent) {\n if (!mouseOnly(mapBrowserEvent)) {\n return;\n }\n\n const map = mapBrowserEvent.map;\n const view = map.getView();\n if (view.getConstraints().rotation === disable) {\n return;\n }\n const size = map.getSize();\n const offset = mapBrowserEvent.pixel;\n const theta = Math.atan2(size[1] / 2 - offset[1], offset[0] - size[0] / 2);\n if (this.lastAngle_ !== undefined) {\n const delta = theta - this.lastAngle_;\n view.adjustRotationInternal(-delta);\n }\n this.lastAngle_ = theta;\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleUpEvent(mapBrowserEvent) {\n if (!mouseOnly(mapBrowserEvent)) {\n return true;\n }\n\n const map = mapBrowserEvent.map;\n const view = map.getView();\n view.endInteraction(this.duration_);\n return false;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleDownEvent(mapBrowserEvent) {\n if (!mouseOnly(mapBrowserEvent)) {\n return false;\n }\n\n if (\n mouseActionButton(mapBrowserEvent) &&\n this.condition_(mapBrowserEvent)\n ) {\n const map = mapBrowserEvent.map;\n map.getView().beginInteraction();\n this.lastAngle_ = undefined;\n return true;\n }\n return false;\n }\n}\n\nexport default DragRotate;\n","/**\n * @module ol/render/Box\n */\n\nimport Disposable from '../Disposable.js';\nimport Polygon from '../geom/Polygon.js';\n\nclass RenderBox extends Disposable {\n /**\n * @param {string} className CSS class name.\n */\n constructor(className) {\n super();\n\n /**\n * @type {import(\"../geom/Polygon.js\").default}\n * @private\n */\n this.geometry_ = null;\n\n /**\n * @type {HTMLDivElement}\n * @private\n */\n this.element_ = document.createElement('div');\n this.element_.style.position = 'absolute';\n this.element_.style.pointerEvents = 'auto';\n this.element_.className = 'ol-box ' + className;\n\n /**\n * @private\n * @type {import(\"../Map.js\").default|null}\n */\n this.map_ = null;\n\n /**\n * @private\n * @type {import(\"../pixel.js\").Pixel}\n */\n this.startPixel_ = null;\n\n /**\n * @private\n * @type {import(\"../pixel.js\").Pixel}\n */\n this.endPixel_ = null;\n }\n\n /**\n * Clean up.\n * @override\n */\n disposeInternal() {\n this.setMap(null);\n }\n\n /**\n * @private\n */\n render_() {\n const startPixel = this.startPixel_;\n const endPixel = this.endPixel_;\n const px = 'px';\n const style = this.element_.style;\n style.left = Math.min(startPixel[0], endPixel[0]) + px;\n style.top = Math.min(startPixel[1], endPixel[1]) + px;\n style.width = Math.abs(endPixel[0] - startPixel[0]) + px;\n style.height = Math.abs(endPixel[1] - startPixel[1]) + px;\n }\n\n /**\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMap(map) {\n if (this.map_) {\n this.map_.getOverlayContainer().removeChild(this.element_);\n const style = this.element_.style;\n style.left = 'inherit';\n style.top = 'inherit';\n style.width = 'inherit';\n style.height = 'inherit';\n }\n this.map_ = map;\n if (this.map_) {\n this.map_.getOverlayContainer().appendChild(this.element_);\n }\n }\n\n /**\n * @param {import(\"../pixel.js\").Pixel} startPixel Start pixel.\n * @param {import(\"../pixel.js\").Pixel} endPixel End pixel.\n */\n setPixels(startPixel, endPixel) {\n this.startPixel_ = startPixel;\n this.endPixel_ = endPixel;\n this.createOrUpdateGeometry();\n this.render_();\n }\n\n /**\n * Creates or updates the cached geometry.\n */\n createOrUpdateGeometry() {\n if (!this.map_) {\n return;\n }\n\n const startPixel = this.startPixel_;\n const endPixel = this.endPixel_;\n const pixels = [\n startPixel,\n [startPixel[0], endPixel[1]],\n endPixel,\n [endPixel[0], startPixel[1]],\n ];\n const coordinates = pixels.map(\n this.map_.getCoordinateFromPixelInternal,\n this.map_,\n );\n // close the polygon\n coordinates[4] = coordinates[0].slice();\n if (!this.geometry_) {\n this.geometry_ = new Polygon([coordinates]);\n } else {\n this.geometry_.setCoordinates([coordinates]);\n }\n }\n\n /**\n * @return {import(\"../geom/Polygon.js\").default} Geometry.\n */\n getGeometry() {\n return this.geometry_;\n }\n}\n\nexport default RenderBox;\n","/**\n * @module ol/interaction/DragBox\n */\n// FIXME draw drag box\nimport Event from '../events/Event.js';\nimport {mouseActionButton} from '../events/condition.js';\nimport RenderBox from '../render/Box.js';\nimport PointerInteraction from './Pointer.js';\n\n/**\n * A function that takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and two\n * {@link module:ol/pixel~Pixel}s and returns a `{boolean}`. If the condition is met,\n * true should be returned.\n * @typedef {function(this: ?, import(\"../MapBrowserEvent.js\").default, import(\"../pixel.js\").Pixel, import(\"../pixel.js\").Pixel):boolean} EndCondition\n */\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-dragbox'] CSS class name for styling the box.\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a boolean\n * to indicate whether that event should be handled.\n * Default is {@link ol/events/condition~mouseActionButton}.\n * @property {number} [minArea=64] The minimum area of the box in pixel, this value is used by the default\n * `boxEndCondition` function.\n * @property {EndCondition} [boxEndCondition] A function that takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and two\n * {@link module:ol/pixel~Pixel}s to indicate whether a `boxend` event should be fired.\n * Default is `true` if the area of the box is bigger than the `minArea` option.\n * @property {function(this:DragBox, import(\"../MapBrowserEvent.js\").default):void} [onBoxEnd] Code to execute just\n * before `boxend` is fired.\n */\n\n/**\n * @enum {string}\n */\nconst DragBoxEventType = {\n /**\n * Triggered upon drag box start.\n * @event DragBoxEvent#boxstart\n * @api\n */\n BOXSTART: 'boxstart',\n\n /**\n * Triggered on drag when box is active.\n * @event DragBoxEvent#boxdrag\n * @api\n */\n BOXDRAG: 'boxdrag',\n\n /**\n * Triggered upon drag box end.\n * @event DragBoxEvent#boxend\n * @api\n */\n BOXEND: 'boxend',\n\n /**\n * Triggered upon drag box canceled.\n * @event DragBoxEvent#boxcancel\n * @api\n */\n BOXCANCEL: 'boxcancel',\n};\n\n/**\n * @classdesc\n * Events emitted by {@link module:ol/interaction/DragBox~DragBox} instances are instances of\n * this type.\n */\nexport class DragBoxEvent extends Event {\n /**\n * @param {string} type The event type.\n * @param {import(\"../coordinate.js\").Coordinate} coordinate The event coordinate.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Originating event.\n */\n constructor(type, coordinate, mapBrowserEvent) {\n super(type);\n\n /**\n * The coordinate of the drag event.\n * @const\n * @type {import(\"../coordinate.js\").Coordinate}\n * @api\n */\n this.coordinate = coordinate;\n\n /**\n * @const\n * @type {import(\"../MapBrowserEvent.js\").default}\n * @api\n */\n this.mapBrowserEvent = mapBrowserEvent;\n }\n}\n\n/***\n * @template Return\n * @typedef {import(\"../Observable.js\").OnSignature &\n * import(\"../Observable.js\").OnSignature &\n * import(\"../Observable.js\").OnSignature<'boxcancel'|'boxdrag'|'boxend'|'boxstart', DragBoxEvent, Return> &\n * import(\"../Observable.js\").CombinedOnSignature} DragBoxOnSignature\n */\n\n/**\n * @classdesc\n * Allows the user to draw a vector box by clicking and dragging on the map,\n * normally combined with a {@link module:ol/events/condition} that limits\n * it to when the shift or other key is held down. This is used, for example,\n * for zooming to a specific area of the map\n * (see {@link module:ol/interaction/DragZoom~DragZoom} and\n * {@link module:ol/interaction/DragRotateAndZoom~DragRotateAndZoom}).\n *\n * @fires DragBoxEvent\n * @api\n */\nclass DragBox extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super();\n\n /***\n * @type {DragBoxOnSignature}\n */\n this.on;\n\n /***\n * @type {DragBoxOnSignature}\n */\n this.once;\n\n /***\n * @type {DragBoxOnSignature}\n */\n this.un;\n\n options = options ?? {};\n\n /**\n * @type {import(\"../render/Box.js\").default}\n * @private\n */\n this.box_ = new RenderBox(options.className || 'ol-dragbox');\n\n /**\n * @type {number}\n * @private\n */\n this.minArea_ = options.minArea ?? 64;\n\n if (options.onBoxEnd) {\n this.onBoxEnd = options.onBoxEnd;\n }\n\n /**\n * @type {import(\"../pixel.js\").Pixel}\n * @private\n */\n this.startPixel_ = null;\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.condition ?? mouseActionButton;\n\n /**\n * @private\n * @type {EndCondition}\n */\n this.boxEndCondition_ =\n options.boxEndCondition ?? this.defaultBoxEndCondition;\n }\n\n /**\n * The default condition for determining whether the boxend event\n * should fire.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent The originating MapBrowserEvent\n * leading to the box end.\n * @param {import(\"../pixel.js\").Pixel} startPixel The starting pixel of the box.\n * @param {import(\"../pixel.js\").Pixel} endPixel The end pixel of the box.\n * @return {boolean} Whether or not the boxend condition should be fired.\n */\n defaultBoxEndCondition(mapBrowserEvent, startPixel, endPixel) {\n const width = endPixel[0] - startPixel[0];\n const height = endPixel[1] - startPixel[1];\n return width * width + height * height >= this.minArea_;\n }\n\n /**\n * Returns geometry of last drawn box.\n * @return {import(\"../geom/Polygon.js\").default} Geometry.\n * @api\n */\n getGeometry() {\n return this.box_.getGeometry();\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @override\n */\n handleDragEvent(mapBrowserEvent) {\n if (!this.startPixel_) {\n return;\n }\n\n this.box_.setPixels(this.startPixel_, mapBrowserEvent.pixel);\n\n this.dispatchEvent(\n new DragBoxEvent(\n DragBoxEventType.BOXDRAG,\n mapBrowserEvent.coordinate,\n mapBrowserEvent,\n ),\n );\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleUpEvent(mapBrowserEvent) {\n if (!this.startPixel_) {\n return false;\n }\n\n const completeBox = this.boxEndCondition_(\n mapBrowserEvent,\n this.startPixel_,\n mapBrowserEvent.pixel,\n );\n if (completeBox) {\n this.onBoxEnd(mapBrowserEvent);\n }\n this.dispatchEvent(\n new DragBoxEvent(\n completeBox ? DragBoxEventType.BOXEND : DragBoxEventType.BOXCANCEL,\n mapBrowserEvent.coordinate,\n mapBrowserEvent,\n ),\n );\n\n this.box_.setMap(null);\n this.startPixel_ = null;\n\n return false;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleDownEvent(mapBrowserEvent) {\n if (this.condition_(mapBrowserEvent)) {\n this.startPixel_ = mapBrowserEvent.pixel;\n this.box_.setMap(mapBrowserEvent.map);\n this.box_.setPixels(this.startPixel_, this.startPixel_);\n this.dispatchEvent(\n new DragBoxEvent(\n DragBoxEventType.BOXSTART,\n mapBrowserEvent.coordinate,\n mapBrowserEvent,\n ),\n );\n return true;\n }\n return false;\n }\n\n /**\n * Function to execute just before `onboxend` is fired\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n */\n onBoxEnd(event) {}\n\n /**\n * Activate or deactivate the interaction.\n * @param {boolean} active Active.\n * @observable\n * @api\n * @override\n */\n setActive(active) {\n if (!active) {\n this.box_.setMap(null);\n if (this.startPixel_) {\n this.dispatchEvent(\n new DragBoxEvent(DragBoxEventType.BOXCANCEL, this.startPixel_, null),\n );\n this.startPixel_ = null;\n }\n }\n\n super.setActive(active);\n }\n\n /**\n * @param {import(\"../Map.js\").default|null} map Map.\n * @override\n */\n setMap(map) {\n const oldMap = this.getMap();\n\n if (oldMap) {\n this.box_.setMap(null);\n\n if (this.startPixel_) {\n this.dispatchEvent(\n new DragBoxEvent(DragBoxEventType.BOXCANCEL, this.startPixel_, null),\n );\n this.startPixel_ = null;\n }\n }\n\n super.setMap(map);\n }\n}\n\nexport default DragBox;\n","/**\n * @module ol/interaction/DragZoom\n */\nimport {easeOut} from '../easing.js';\nimport {shiftKeyOnly} from '../events/condition.js';\nimport DragBox from './DragBox.js';\n\n/**\n * @typedef {Object} Options\n * @property {string} [className='ol-dragzoom'] CSS class name for styling the\n * box.\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled.\n * Default is {@link module:ol/events/condition.shiftKeyOnly}.\n * @property {number} [duration=200] Animation duration in milliseconds.\n * @property {boolean} [out=false] Use interaction for zooming out.\n * @property {number} [minArea=64] The minimum area of the box in pixel, this value is used by the parent default\n * `boxEndCondition` function.\n */\n\n/**\n * @classdesc\n * Allows the user to zoom the map by clicking and dragging on the map,\n * normally combined with a {@link module:ol/events/condition} that limits\n * it to when a key, shift by default, is held down.\n *\n * To change the style of the box, use CSS and the `.ol-dragzoom` selector, or\n * your custom one configured with `className`.\n * @api\n */\nclass DragZoom extends DragBox {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n const condition = options.condition ? options.condition : shiftKeyOnly;\n\n super({\n condition: condition,\n className: options.className || 'ol-dragzoom',\n minArea: options.minArea,\n });\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 200;\n\n /**\n * @private\n * @type {boolean}\n */\n this.out_ = options.out !== undefined ? options.out : false;\n }\n\n /**\n * Function to execute just before `onboxend` is fired\n * @param {import(\"../MapBrowserEvent.js\").default} event Event.\n * @override\n */\n onBoxEnd(event) {\n const map = this.getMap();\n const view = /** @type {!import(\"../View.js\").default} */ (map.getView());\n let geometry = this.getGeometry();\n\n if (this.out_) {\n const rotatedExtent = view.rotatedExtentForGeometry(geometry);\n const resolution = view.getResolutionForExtentInternal(rotatedExtent);\n const factor = view.getResolution() / resolution;\n geometry = geometry.clone();\n geometry.scale(factor * factor);\n }\n\n view.fitInternal(geometry, {\n duration: this.duration_,\n easing: easeOut,\n });\n }\n}\n\nexport default DragZoom;\n","/**\n * @module ol/events/Key\n */\n\n/**\n * @enum {string}\n * @const\n */\nexport default {\n LEFT: 'ArrowLeft',\n UP: 'ArrowUp',\n RIGHT: 'ArrowRight',\n DOWN: 'ArrowDown',\n};\n","/**\n * @module ol/interaction/KeyboardPan\n */\nimport {rotate as rotateCoordinate} from '../coordinate.js';\nimport EventType from '../events/EventType.js';\nimport Key from '../events/Key.js';\nimport {noModifierKeys, targetNotEditable} from '../events/condition.js';\nimport Interaction, {pan} from './Interaction.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled. Default is\n * {@link module:ol/events/condition.noModifierKeys} and\n * {@link module:ol/events/condition.targetNotEditable}.\n * @property {number} [duration=100] Animation duration in milliseconds.\n * @property {number} [pixelDelta=128] The amount of pixels to pan on each key\n * press.\n */\n\n/**\n * @classdesc\n * Allows the user to pan the map using keyboard arrows.\n * Note that, although this interaction is by default included in maps,\n * the keys can only be used when browser focus is on the element to which\n * the keyboard events are attached. By default, this is the map div,\n * though you can change this with the `keyboardEventTarget` in\n * {@link module:ol/Map~Map}. `document` never loses focus but, for any other\n * element, focus will have to be on, and returned to, this element if the keys\n * are to function.\n * See also {@link module:ol/interaction/KeyboardZoom~KeyboardZoom}.\n * @api\n */\nclass KeyboardPan extends Interaction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super();\n\n options = options || {};\n\n /**\n * @private\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Browser event.\n * @return {boolean} Combined condition result.\n */\n this.defaultCondition_ = function (mapBrowserEvent) {\n return (\n noModifierKeys(mapBrowserEvent) && targetNotEditable(mapBrowserEvent)\n );\n };\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ =\n options.condition !== undefined\n ? options.condition\n : this.defaultCondition_;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 100;\n\n /**\n * @private\n * @type {number}\n */\n this.pixelDelta_ =\n options.pixelDelta !== undefined ? options.pixelDelta : 128;\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} if it was a\n * `KeyEvent`, and decides the direction to pan to (if an arrow key was\n * pressed).\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @override\n */\n handleEvent(mapBrowserEvent) {\n let stopEvent = false;\n if (mapBrowserEvent.type == EventType.KEYDOWN) {\n const keyEvent = /** @type {KeyboardEvent} */ (\n mapBrowserEvent.originalEvent\n );\n const key = keyEvent.key;\n if (\n this.condition_(mapBrowserEvent) &&\n (key == Key.DOWN ||\n key == Key.LEFT ||\n key == Key.RIGHT ||\n key == Key.UP)\n ) {\n const map = mapBrowserEvent.map;\n const view = map.getView();\n const mapUnitsDelta = view.getResolution() * this.pixelDelta_;\n let deltaX = 0,\n deltaY = 0;\n if (key == Key.DOWN) {\n deltaY = -mapUnitsDelta;\n } else if (key == Key.LEFT) {\n deltaX = -mapUnitsDelta;\n } else if (key == Key.RIGHT) {\n deltaX = mapUnitsDelta;\n } else {\n deltaY = mapUnitsDelta;\n }\n const delta = [deltaX, deltaY];\n rotateCoordinate(delta, view.getRotation());\n pan(view, delta, this.duration_);\n keyEvent.preventDefault();\n stopEvent = true;\n }\n }\n return !stopEvent;\n }\n}\n\nexport default KeyboardPan;\n","/**\n * @module ol/interaction/KeyboardZoom\n */\nimport EventType from '../events/EventType.js';\nimport {platformModifierKey, targetNotEditable} from '../events/condition.js';\nimport Interaction, {zoomByDelta} from './Interaction.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=100] Animation duration in milliseconds.\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled. The default condition is\n * that {@link module:ol/events/condition.targetNotEditable} is fulfilled and that\n * the platform modifier key isn't pressed\n * (!{@link module:ol/events/condition.platformModifierKey}).\n * @property {number} [delta=1] The zoom level delta on each key press.\n */\n\n/**\n * @classdesc\n * Allows the user to zoom the map using keyboard + and -.\n * Note that, although this interaction is by default included in maps,\n * the keys can only be used when browser focus is on the element to which\n * the keyboard events are attached. By default, this is the map div,\n * though you can change this with the `keyboardEventTarget` in\n * {@link module:ol/Map~Map}. `document` never loses focus but, for any other\n * element, focus will have to be on, and returned to, this element if the keys\n * are to function.\n * See also {@link module:ol/interaction/KeyboardPan~KeyboardPan}.\n * @api\n */\nclass KeyboardZoom extends Interaction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n super();\n\n options = options ? options : {};\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.condition\n ? options.condition\n : function (mapBrowserEvent) {\n return (\n !platformModifierKey(mapBrowserEvent) &&\n targetNotEditable(mapBrowserEvent)\n );\n };\n\n /**\n * @private\n * @type {number}\n */\n this.delta_ = options.delta ? options.delta : 1;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 100;\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} if it was a\n * `KeyEvent`, and decides whether to zoom in or out (depending on whether the\n * key pressed was '+' or '-').\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @override\n */\n handleEvent(mapBrowserEvent) {\n let stopEvent = false;\n if (\n mapBrowserEvent.type == EventType.KEYDOWN ||\n mapBrowserEvent.type == EventType.KEYPRESS\n ) {\n const keyEvent = /** @type {KeyboardEvent} */ (\n mapBrowserEvent.originalEvent\n );\n const key = keyEvent.key;\n if (this.condition_(mapBrowserEvent) && (key === '+' || key === '-')) {\n const map = mapBrowserEvent.map;\n const delta = key === '+' ? this.delta_ : -this.delta_;\n const view = map.getView();\n zoomByDelta(view, delta, undefined, this.duration_);\n keyEvent.preventDefault();\n stopEvent = true;\n }\n }\n return !stopEvent;\n }\n}\n\nexport default KeyboardZoom;\n","/**\n * @module ol/interaction/MouseWheelZoom\n */\nimport {listen, unlistenByKey} from '../events.js';\nimport EventType from '../events/EventType.js';\nimport {all, always, focusWithTabindex} from '../events/condition.js';\nimport {clamp} from '../math.js';\nimport Interaction, {zoomByDelta} from './Interaction.js';\n\n/**\n * @typedef {'trackpad' | 'wheel'} Mode\n */\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../events/condition.js\").Condition} [condition] A function that\n * takes a {@link module:ol/MapBrowserEvent~MapBrowserEvent} and returns a\n * boolean to indicate whether that event should be handled. Default is\n * {@link module:ol/events/condition.always}.\n * @property {boolean} [onFocusOnly=false] When the map's target has a `tabindex` attribute set,\n * the interaction will only handle events when the map has the focus.\n * @property {number} [maxDelta=1] Maximum mouse wheel delta.\n * @property {number} [duration=250] Animation duration in milliseconds.\n * @property {number} [timeout=80] Mouse wheel timeout duration in milliseconds.\n * @property {boolean} [useAnchor=true] Enable zooming using the mouse's\n * location as the anchor. When set to `false`, zooming in and out will zoom to\n * the center of the screen instead of zooming on the mouse's location.\n * @property {boolean} [constrainResolution=false] If true, the mouse wheel zoom\n * event will always animate to the closest zoom level after an interaction;\n * false means intermediary zoom levels are allowed.\n */\n\n/**\n * Mutliplier for the DOM_DELTA_LINE delta value.\n * @type {number}\n */\nconst DELTA_LINE_MULTIPLIER = 40;\n\n/**\n * Mutliplier for the DOM_DELTA_PAGE delta value.\n * @type {number}\n */\nconst DELTA_PAGE_MULTIPLIER = 300;\n\n/**\n * Mutliplier for the delta value when using pinch-to-zoom\n * @type {number}\n */\nconst DELTA_TRACKPAD_PINCH_TO_ZOOM_MULTIPLIER = 3; // 5 = google maps. 3 = apple maps, MapLibre.\n/**\n * @classdesc\n * Allows the user to zoom the map by scrolling the mouse wheel.\n * @api\n */\nclass MouseWheelZoom extends Interaction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n super(\n /** @type {import(\"./Interaction.js\").InteractionOptions} */ (options),\n );\n\n /**\n * @private\n * @type {number}\n */\n this.totalDelta_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.lastDelta_ = 0;\n\n /**\n * @private\n * @type {number}\n */\n this.maxDelta_ = options.maxDelta !== undefined ? options.maxDelta : 1;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n\n /**\n * @private\n * @type {number}\n */\n this.timeout_ = options.timeout !== undefined ? options.timeout : 80;\n\n /**\n * @private\n * @type {boolean}\n */\n this.useAnchor_ =\n options.useAnchor !== undefined ? options.useAnchor : true;\n\n /**\n * @private\n * @type {boolean}\n */\n this.constrainResolution_ =\n options.constrainResolution !== undefined\n ? options.constrainResolution\n : false;\n\n const condition = options.condition ? options.condition : always;\n\n /**\n * @private\n * @type {import(\"../events/condition.js\").Condition}\n */\n this.condition_ = options.onFocusOnly\n ? all(focusWithTabindex, condition)\n : condition;\n\n /**\n * @private\n * @type {?import(\"../pixel.js\").Pixel}\n */\n this.lastAnchor_ = null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.startTime_ = undefined;\n\n /**\n * @private\n * @type {ReturnType}\n */\n this.timeoutId_;\n\n /**\n * @private\n * @type {Mode|undefined}\n */\n this.mode_ = undefined;\n\n /**\n * Trackpad events separated by this delay will be considered separate\n * interactions.\n * @private\n * @type {number}\n */\n this.trackpadEventGap_ = 400;\n\n /**\n * @private\n * @type {ReturnType}\n */\n this.trackpadTimeoutId_;\n\n /**\n * The number of delta values per zoom level\n * @private\n * @type {number}\n */\n this.deltaPerZoom_ = 300;\n\n /**\n * Tracks whether the Ctrl key is physically held down (as opposed to the\n * browser synthesizing ctrlKey=true for pinch-to-zoom trackpad gestures).\n * @private\n * @type {boolean}\n */\n this.ctrlKeyPressed_ = false;\n\n /**\n * @private\n * @type {Array}\n */\n this.ctrlKeyListenerKeys_ = [];\n }\n\n /**\n * @param {import('../Map.js').default|null} map Map.\n * @override\n */\n setMap(map) {\n this.ctrlKeyListenerKeys_.forEach(unlistenByKey);\n this.ctrlKeyListenerKeys_.length = 0;\n this.ctrlKeyPressed_ = false;\n super.setMap(map);\n if (map) {\n const doc = map.getOwnerDocument();\n this.ctrlKeyListenerKeys_.push(\n listen(doc, 'keydown', (/** @type {KeyboardEvent} */ e) => {\n if (e.key === 'Control') {\n this.ctrlKeyPressed_ = true;\n }\n }),\n listen(doc, 'keyup', (/** @type {KeyboardEvent} */ e) => {\n if (e.key === 'Control') {\n this.ctrlKeyPressed_ = false;\n }\n }),\n );\n }\n }\n\n /**\n * @private\n */\n endInteraction_() {\n this.trackpadTimeoutId_ = undefined;\n const map = this.getMap();\n if (!map) {\n return;\n }\n const view = map.getView();\n const direction = this.lastDelta_ ? (this.lastDelta_ > 0 ? 1 : -1) : 0;\n view.endInteraction(\n this.constrainResolution_ || view.getConstrainResolution()\n ? 100\n : undefined,\n direction,\n this.lastAnchor_ ? map.getCoordinateFromPixel(this.lastAnchor_) : null,\n );\n }\n\n /**\n * Handles the {@link module:ol/MapBrowserEvent~MapBrowserEvent map browser event} (if it was a mousewheel-event) and eventually\n * zooms the map.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Map browser event.\n * @return {boolean} `false` to stop event propagation.\n * @override\n */\n handleEvent(mapBrowserEvent) {\n if (!this.condition_(mapBrowserEvent)) {\n return true;\n }\n const type = mapBrowserEvent.type;\n if (type !== EventType.WHEEL) {\n return true;\n }\n\n const map = mapBrowserEvent.map;\n const wheelEvent = /** @type {WheelEvent} */ (\n mapBrowserEvent.originalEvent\n );\n wheelEvent.preventDefault();\n\n const isPinchToZoom = wheelEvent.ctrlKey && !this.ctrlKeyPressed_;\n if (!wheelEvent.ctrlKey) {\n this.ctrlKeyPressed_ = false;\n }\n\n if (this.useAnchor_) {\n this.lastAnchor_ = mapBrowserEvent.pixel;\n }\n\n // Delta normalisation inspired by\n // https://github.com/mapbox/mapbox-gl-js/blob/001c7b9/js/ui/handler/scroll_zoom.js\n let delta = wheelEvent.deltaY;\n\n switch (wheelEvent.deltaMode) {\n case WheelEvent.DOM_DELTA_LINE:\n delta *= DELTA_LINE_MULTIPLIER;\n break;\n case WheelEvent.DOM_DELTA_PAGE:\n delta *= DELTA_PAGE_MULTIPLIER;\n break;\n default:\n // pass\n }\n\n if (delta === 0) {\n return false;\n }\n this.lastDelta_ = delta;\n\n const now = Date.now();\n\n if (this.startTime_ === undefined) {\n this.startTime_ = now;\n }\n\n if (!this.mode_ || now - this.startTime_ > this.trackpadEventGap_) {\n this.mode_ = Math.abs(delta) < 4 ? 'trackpad' : 'wheel';\n }\n\n const view = map.getView();\n if (this.mode_ === 'trackpad') {\n if (this.trackpadTimeoutId_) {\n clearTimeout(this.trackpadTimeoutId_);\n } else {\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n view.beginInteraction();\n }\n this.trackpadTimeoutId_ = setTimeout(\n this.endInteraction_.bind(this),\n this.timeout_,\n );\n if (isPinchToZoom) {\n delta = delta * DELTA_TRACKPAD_PINCH_TO_ZOOM_MULTIPLIER;\n }\n view.adjustZoom(\n -delta / this.deltaPerZoom_,\n this.lastAnchor_ ? map.getCoordinateFromPixel(this.lastAnchor_) : null,\n );\n this.startTime_ = now;\n return false;\n }\n\n this.totalDelta_ += delta;\n\n const timeLeft = Math.max(this.timeout_ - (now - this.startTime_), 0);\n\n clearTimeout(this.timeoutId_);\n this.timeoutId_ = setTimeout(\n this.handleWheelZoom_.bind(this, map),\n timeLeft,\n );\n\n return false;\n }\n\n /**\n * @private\n * @param {import(\"../Map.js\").default} map Map.\n */\n handleWheelZoom_(map) {\n const view = map.getView();\n if (view.getAnimating()) {\n view.cancelAnimations();\n }\n let delta =\n -clamp(\n this.totalDelta_,\n -this.maxDelta_ * this.deltaPerZoom_,\n this.maxDelta_ * this.deltaPerZoom_,\n ) / this.deltaPerZoom_;\n if (view.getConstrainResolution() || this.constrainResolution_) {\n // view has a zoom constraint, zoom by 1\n delta = delta ? (delta > 0 ? 1 : -1) : 0;\n }\n zoomByDelta(\n view,\n delta,\n this.lastAnchor_ ? map.getCoordinateFromPixel(this.lastAnchor_) : null,\n this.duration_,\n );\n\n this.mode_ = undefined;\n this.totalDelta_ = 0;\n this.lastAnchor_ = null;\n this.startTime_ = undefined;\n this.timeoutId_ = undefined;\n }\n\n /**\n * Enable or disable using the mouse's location as an anchor when zooming\n * @param {boolean} useAnchor true to zoom to the mouse's location, false\n * to zoom to the center of the map\n * @api\n */\n setMouseAnchor(useAnchor) {\n this.useAnchor_ = useAnchor;\n if (!useAnchor) {\n this.lastAnchor_ = null;\n }\n }\n}\n\nexport default MouseWheelZoom;\n","/**\n * @module ol/interaction/PinchRotate\n */\nimport {FALSE} from '../functions.js';\nimport {disable} from '../rotationconstraint.js';\nimport PointerInteraction, {\n centroid as centroidFromPointers,\n} from './Pointer.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=250] The duration of the animation in\n * milliseconds.\n * @property {number} [threshold=0.3] Minimal angle in radians to start a rotation.\n */\n\n/**\n * @classdesc\n * Allows the user to rotate the map by twisting with two fingers\n * on a touch screen.\n * @api\n */\nclass PinchRotate extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n const pointerOptions = /** @type {import(\"./Pointer.js\").Options} */ (\n options\n );\n\n if (!pointerOptions.stopDown) {\n pointerOptions.stopDown = FALSE;\n }\n\n super(pointerOptions);\n\n /**\n * @private\n * @type {import(\"../coordinate.js\").Coordinate}\n */\n this.anchor_ = null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.lastAngle_ = undefined;\n\n /**\n * @private\n * @type {boolean}\n */\n this.rotating_ = false;\n\n /**\n * @private\n * @type {number}\n */\n this.rotationDelta_ = 0.0;\n\n /**\n * @private\n * @type {number}\n */\n this.threshold_ = options.threshold !== undefined ? options.threshold : 0.3;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 250;\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @override\n */\n handleDragEvent(mapBrowserEvent) {\n let rotationDelta = 0.0;\n\n const touch0 = this.targetPointers[0];\n const touch1 = this.targetPointers[1];\n\n // angle between touches\n const angle = Math.atan2(\n touch1.clientY - touch0.clientY,\n touch1.clientX - touch0.clientX,\n );\n\n if (this.lastAngle_ !== undefined) {\n const delta = angle - this.lastAngle_;\n this.rotationDelta_ += delta;\n if (!this.rotating_ && Math.abs(this.rotationDelta_) > this.threshold_) {\n this.rotating_ = true;\n }\n rotationDelta = delta;\n }\n this.lastAngle_ = angle;\n\n const map = mapBrowserEvent.map;\n const view = map.getView();\n if (view.getConstraints().rotation === disable) {\n return;\n }\n\n // rotate anchor point.\n // FIXME: should be the intersection point between the lines:\n // touch0,touch1 and previousTouch0,previousTouch1\n this.anchor_ = map.getCoordinateFromPixelInternal(\n map.getEventPixel(centroidFromPointers(this.targetPointers)),\n );\n\n // rotate\n if (this.rotating_) {\n map.render();\n view.adjustRotationInternal(rotationDelta, this.anchor_);\n }\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleUpEvent(mapBrowserEvent) {\n if (this.targetPointers.length < 2) {\n const map = mapBrowserEvent.map;\n const view = map.getView();\n view.endInteraction(this.duration_);\n return false;\n }\n return true;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleDownEvent(mapBrowserEvent) {\n if (this.targetPointers.length >= 2) {\n const map = mapBrowserEvent.map;\n this.anchor_ = null;\n this.lastAngle_ = undefined;\n this.rotating_ = false;\n this.rotationDelta_ = 0.0;\n if (!this.handlingDownUpSequence) {\n map.getView().beginInteraction();\n }\n return true;\n }\n return false;\n }\n}\n\nexport default PinchRotate;\n","/**\n * @module ol/interaction/PinchZoom\n */\nimport {FALSE} from '../functions.js';\nimport PointerInteraction, {\n centroid as centroidFromPointers,\n} from './Pointer.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} [duration=400] Animation duration in milliseconds.\n */\n\n/**\n * @classdesc\n * Allows the user to zoom the map by pinching with two fingers\n * on a touch screen.\n * @api\n */\nclass PinchZoom extends PointerInteraction {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {};\n\n const pointerOptions = /** @type {import(\"./Pointer.js\").Options} */ (\n options\n );\n\n if (!pointerOptions.stopDown) {\n pointerOptions.stopDown = FALSE;\n }\n\n super(pointerOptions);\n\n /**\n * @private\n * @type {import(\"../coordinate.js\").Coordinate}\n */\n this.anchor_ = null;\n\n /**\n * @private\n * @type {number}\n */\n this.duration_ = options.duration !== undefined ? options.duration : 400;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.lastDistance_ = undefined;\n\n /**\n * @private\n * @type {number}\n */\n this.lastScaleDelta_ = 1;\n }\n\n /**\n * Handle pointer drag events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @override\n */\n handleDragEvent(mapBrowserEvent) {\n let scaleDelta = 1.0;\n\n const touch0 = this.targetPointers[0];\n const touch1 = this.targetPointers[1];\n const dx = touch0.clientX - touch1.clientX;\n const dy = touch0.clientY - touch1.clientY;\n\n // distance between touches\n const distance = Math.sqrt(dx * dx + dy * dy);\n\n if (this.lastDistance_ !== undefined) {\n scaleDelta = this.lastDistance_ / distance;\n }\n this.lastDistance_ = distance;\n\n const map = mapBrowserEvent.map;\n const view = map.getView();\n\n if (scaleDelta != 1.0) {\n this.lastScaleDelta_ = scaleDelta;\n }\n\n // scale anchor point.\n this.anchor_ = map.getCoordinateFromPixelInternal(\n map.getEventPixel(centroidFromPointers(this.targetPointers)),\n );\n\n // scale, bypass the resolution constraint\n map.render();\n view.adjustResolutionInternal(scaleDelta, this.anchor_);\n }\n\n /**\n * Handle pointer up events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleUpEvent(mapBrowserEvent) {\n if (this.targetPointers.length < 2) {\n const map = mapBrowserEvent.map;\n const view = map.getView();\n const direction = this.lastScaleDelta_ > 1 ? 1 : -1;\n view.endInteraction(this.duration_, direction);\n return false;\n }\n return true;\n }\n\n /**\n * Handle pointer down events.\n * @param {import(\"../MapBrowserEvent.js\").default} mapBrowserEvent Event.\n * @return {boolean} If the event was consumed.\n * @override\n */\n handleDownEvent(mapBrowserEvent) {\n if (this.targetPointers.length >= 2) {\n const map = mapBrowserEvent.map;\n this.anchor_ = null;\n this.lastDistance_ = undefined;\n this.lastScaleDelta_ = 1;\n if (!this.handlingDownUpSequence) {\n map.getView().beginInteraction();\n }\n return true;\n }\n return false;\n }\n}\n\nexport default PinchZoom;\n","/**\n * @module ol/interaction/defaults\n */\nimport Collection from '../Collection.js';\nimport Kinetic from '../Kinetic.js';\nimport DoubleClickZoom from './DoubleClickZoom.js';\nimport DragPan from './DragPan.js';\nimport DragRotate from './DragRotate.js';\nimport DragZoom from './DragZoom.js';\nimport KeyboardPan from './KeyboardPan.js';\nimport KeyboardZoom from './KeyboardZoom.js';\nimport MouseWheelZoom from './MouseWheelZoom.js';\nimport PinchRotate from './PinchRotate.js';\nimport PinchZoom from './PinchZoom.js';\n\n/**\n * @typedef {Object} DefaultsOptions\n * @property {boolean} [altShiftDragRotate=true] Whether Alt-Shift-drag rotate is\n * desired.\n * @property {boolean} [onFocusOnly=false] Interact only when the map has the\n * focus. This affects the `MouseWheelZoom` and `DragPan` interactions and is\n * useful when page scroll is desired for maps that do not have the browser's\n * focus.\n * @property {boolean} [doubleClickZoom=true] Whether double click zoom is\n * desired.\n * @property {boolean} [keyboard=true] Whether keyboard interaction is desired.\n * @property {boolean} [mouseWheelZoom=true] Whether mousewheel zoom is desired.\n * @property {boolean} [shiftDragZoom=true] Whether Shift-drag zoom is desired.\n * @property {boolean} [dragPan=true] Whether drag pan is desired.\n * @property {boolean} [pinchRotate=true] Whether pinch rotate is desired.\n * @property {boolean} [pinchZoom=true] Whether pinch zoom is desired.\n * @property {number} [zoomDelta] Zoom level delta when using keyboard or double click zoom.\n * @property {number} [zoomDuration] Duration of the zoom animation in\n * milliseconds.\n */\n\n/**\n * Set of interactions included in maps by default. Specific interactions can be\n * excluded by setting the appropriate option to false in the constructor\n * options, but the order of the interactions is fixed. If you want to specify\n * a different order for interactions, you will need to create your own\n * {@link module:ol/interaction/Interaction~Interaction} instances and insert\n * them into a {@link module:ol/Collection~Collection} in the order you want\n * before creating your {@link module:ol/Map~Map} instance. Changing the order can\n * be of interest if the event propagation needs to be stopped at a point.\n * The default set of interactions, in sequence, is:\n * {@link module:ol/interaction/DragRotate~DragRotate}\n * {@link module:ol/interaction/DoubleClickZoom~DoubleClickZoom}\n * {@link module:ol/interaction/DragPan~DragPan}\n * {@link module:ol/interaction/PinchRotate~PinchRotate}\n * {@link module:ol/interaction/PinchZoom~PinchZoom}\n * {@link module:ol/interaction/KeyboardPan~KeyboardPan}\n * {@link module:ol/interaction/KeyboardZoom~KeyboardZoom}\n * {@link module:ol/interaction/MouseWheelZoom~MouseWheelZoom}\n * {@link module:ol/interaction/DragZoom~DragZoom}\n *\n * @param {DefaultsOptions} [options] Defaults options.\n * @return {Collection}\n * A collection of interactions to be used with the {@link module:ol/Map~Map}\n * constructor's `interactions` option.\n * @api\n */\nexport function defaults(options) {\n options = options ? options : {};\n\n /** @type {Collection} */\n const interactions = new Collection();\n\n const kinetic = new Kinetic(-0.005, 0.05, 100);\n\n const altShiftDragRotate =\n options.altShiftDragRotate !== undefined\n ? options.altShiftDragRotate\n : true;\n if (altShiftDragRotate) {\n interactions.push(new DragRotate());\n }\n\n const doubleClickZoom =\n options.doubleClickZoom !== undefined ? options.doubleClickZoom : true;\n if (doubleClickZoom) {\n interactions.push(\n new DoubleClickZoom({\n delta: options.zoomDelta,\n duration: options.zoomDuration,\n }),\n );\n }\n\n const dragPan = options.dragPan !== undefined ? options.dragPan : true;\n if (dragPan) {\n interactions.push(\n new DragPan({\n onFocusOnly: options.onFocusOnly,\n kinetic: kinetic,\n }),\n );\n }\n\n const pinchRotate =\n options.pinchRotate !== undefined ? options.pinchRotate : true;\n if (pinchRotate) {\n interactions.push(new PinchRotate());\n }\n\n const pinchZoom = options.pinchZoom !== undefined ? options.pinchZoom : true;\n if (pinchZoom) {\n interactions.push(\n new PinchZoom({\n duration: options.zoomDuration,\n }),\n );\n }\n\n const keyboard = options.keyboard !== undefined ? options.keyboard : true;\n if (keyboard) {\n interactions.push(new KeyboardPan());\n interactions.push(\n new KeyboardZoom({\n delta: options.zoomDelta,\n duration: options.zoomDuration,\n }),\n );\n }\n\n const mouseWheelZoom =\n options.mouseWheelZoom !== undefined ? options.mouseWheelZoom : true;\n if (mouseWheelZoom) {\n interactions.push(\n new MouseWheelZoom({\n onFocusOnly: options.onFocusOnly,\n duration: options.zoomDuration,\n }),\n );\n }\n\n const shiftDragZoom =\n options.shiftDragZoom !== undefined ? options.shiftDragZoom : true;\n if (shiftDragZoom) {\n interactions.push(\n new DragZoom({\n duration: options.zoomDuration,\n }),\n );\n }\n\n return interactions;\n}\n","/**\n * @module ol/layer/Property\n */\n\n/**\n * @enum {string}\n */\nexport default {\n OPACITY: 'opacity',\n VISIBLE: 'visible',\n EXTENT: 'extent',\n Z_INDEX: 'zIndex',\n MAX_RESOLUTION: 'maxResolution',\n MIN_RESOLUTION: 'minResolution',\n MAX_ZOOM: 'maxZoom',\n MIN_ZOOM: 'minZoom',\n SOURCE: 'source',\n MAP: 'map',\n};\n","/**\n * @module ol/layer/Base\n */\nimport BaseObject from '../Object.js';\nimport {assert} from '../asserts.js';\nimport {clamp} from '../math.js';\nimport {abstract} from '../util.js';\nimport LayerProperty from './Property.js';\n\n/**\n * A css color, or a function called with a view resolution returning a css color.\n *\n * @typedef {string|function(number):string} BackgroundColor\n * @api\n */\n\n/**\n * @typedef {import(\"../ObjectEventType.js\").Types|'change:extent'|'change:maxResolution'|'change:maxZoom'|\n * 'change:minResolution'|'change:minZoom'|'change:opacity'|'change:visible'|'change:zIndex'} BaseLayerObjectEventTypes\n */\n\n/***\n * @template Return\n * @typedef {import(\"../Observable.js\").OnSignature &\n * import(\"../Observable.js\").OnSignature &\n * import(\"../Observable.js\").CombinedOnSignature} BaseLayerOnSignature\n */\n\n/**\n * @template {Object} [Properties=Object]\n * @typedef {Object} Options\n * @property {string} [className='ol-layer'] A CSS class name to set to the layer element.\n * @property {number} [opacity=1] Opacity (0, 1).\n * @property {boolean} [visible=true] Visibility.\n * @property {import(\"../extent.js\").Extent} [extent] The bounding extent for layer rendering. The layer will not be\n * rendered outside of this extent.\n * @property {number | undefined} [zIndex] The z-index for layer rendering. At rendering time, the layers\n * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed\n * for layers that are added to the map's `layers` collection, or `Infinity` when the layer's `setMap()`\n * method was used.\n * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be\n * visible.\n * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n * @property {BackgroundColor} [background] Background color for the layer. If not specified, no background\n * will be rendered.\n * @property {Properties} [properties] Arbitrary observable properties. Can be accessed with `#get()` and `#set()`.\n */\n\n/**\n * @classdesc\n * Abstract base class; normally only used for creating subclasses and not\n * instantiated in apps.\n * Note that with {@link module:ol/layer/Base~BaseLayer} and all its subclasses, any property set in\n * the options is set as a {@link module:ol/Object~BaseObject} property on the layer object, so\n * is observable, and has get/set accessors.\n *\n * @api\n * @template {Object} [Properties=Object]\n * @extends {BaseObject & Object>}\n */\nclass BaseLayer extends BaseObject {\n /**\n * @param {Options>} options Layer options.\n */\n constructor(options) {\n super();\n\n /***\n * @type {BaseLayerOnSignature}\n */\n this.on;\n\n /***\n * @type {BaseLayerOnSignature}\n */\n this.once;\n\n /***\n * @type {BaseLayerOnSignature}\n */\n this.un;\n\n /**\n * @type {BackgroundColor|false}\n * @private\n */\n this.background_ = options.background;\n\n /**\n * @type {?}\n */\n const properties = Object.assign({}, options);\n if (typeof options.properties === 'object') {\n delete properties.properties;\n Object.assign(properties, options.properties);\n }\n\n properties[LayerProperty.OPACITY] =\n options.opacity !== undefined ? options.opacity : 1;\n assert(\n typeof properties[LayerProperty.OPACITY] === 'number',\n 'Layer opacity must be a number',\n );\n\n properties[LayerProperty.VISIBLE] =\n options.visible !== undefined ? options.visible : true;\n properties[LayerProperty.Z_INDEX] = options.zIndex;\n properties[LayerProperty.MAX_RESOLUTION] =\n options.maxResolution !== undefined ? options.maxResolution : Infinity;\n properties[LayerProperty.MIN_RESOLUTION] =\n options.minResolution !== undefined ? options.minResolution : 0;\n properties[LayerProperty.MIN_ZOOM] =\n options.minZoom !== undefined ? options.minZoom : -Infinity;\n properties[LayerProperty.MAX_ZOOM] =\n options.maxZoom !== undefined ? options.maxZoom : Infinity;\n\n /**\n * @type {string}\n * @private\n */\n this.className_ =\n properties.className !== undefined ? properties.className : 'ol-layer';\n delete properties.className;\n\n this.setProperties(properties);\n\n /**\n * @type {import(\"./Layer.js\").State}\n * @private\n */\n this.state_ = null;\n }\n\n /**\n * Get the background for this layer.\n * @return {BackgroundColor|false} Layer background.\n */\n getBackground() {\n return this.background_;\n }\n\n /**\n * @return {string} CSS class name.\n */\n getClassName() {\n return this.className_;\n }\n\n /**\n * This method is not meant to be called by layers or layer renderers because the state\n * is incorrect if the layer is included in a layer group.\n *\n * @param {boolean} [managed] Layer is managed.\n * @return {import(\"./Layer.js\").State} Layer state.\n */\n getLayerState(managed) {\n /** @type {import(\"./Layer.js\").State} */\n const state =\n this.state_ ||\n /** @type {?} */ ({\n layer: this,\n managed: managed === undefined ? true : managed,\n });\n const zIndex = this.getZIndex();\n state.opacity = clamp(Math.round(this.getOpacity() * 100) / 100, 0, 1);\n state.visible = this.getVisible();\n state.extent = this.getExtent();\n state.zIndex = zIndex === undefined && !state.managed ? Infinity : zIndex;\n state.maxResolution = this.getMaxResolution();\n state.minResolution = Math.max(this.getMinResolution(), 0);\n state.minZoom = this.getMinZoom();\n state.maxZoom = this.getMaxZoom();\n this.state_ = state;\n\n return state;\n }\n\n /**\n * @abstract\n * @param {Array} [array] Array of layers (to be\n * modified in place).\n * @return {Array} Array of layers.\n */\n getLayersArray(array) {\n return abstract();\n }\n\n /**\n * @abstract\n * @param {Array} [states] Optional list of layer\n * states (to be modified in place).\n * @return {Array} List of layer states.\n */\n getLayerStatesArray(states) {\n return abstract();\n }\n\n /**\n * Return the {@link module:ol/extent~Extent extent} of the layer or `undefined` if it\n * will be visible regardless of extent.\n * @return {import(\"../extent.js\").Extent|undefined} The layer extent.\n * @observable\n * @api\n */\n getExtent() {\n return /** @type {import(\"../extent.js\").Extent|undefined} */ (\n this.get(LayerProperty.EXTENT)\n );\n }\n\n /**\n * Return the maximum resolution of the layer. Returns Infinity if\n * the layer has no maximum resolution set.\n * @return {number} The maximum resolution of the layer.\n * @observable\n * @api\n */\n getMaxResolution() {\n return /** @type {number} */ (this.get(LayerProperty.MAX_RESOLUTION));\n }\n\n /**\n * Return the minimum resolution of the layer. Returns 0 if\n * the layer has no minimum resolution set.\n * @return {number} The minimum resolution of the layer.\n * @observable\n * @api\n */\n getMinResolution() {\n return /** @type {number} */ (this.get(LayerProperty.MIN_RESOLUTION));\n }\n\n /**\n * Return the minimum zoom level of the layer. Returns -Infinity if\n * the layer has no minimum zoom set.\n * @return {number} The minimum zoom level of the layer.\n * @observable\n * @api\n */\n getMinZoom() {\n return /** @type {number} */ (this.get(LayerProperty.MIN_ZOOM));\n }\n\n /**\n * Return the maximum zoom level of the layer. Returns Infinity if\n * the layer has no maximum zoom set.\n * @return {number} The maximum zoom level of the layer.\n * @observable\n * @api\n */\n getMaxZoom() {\n return /** @type {number} */ (this.get(LayerProperty.MAX_ZOOM));\n }\n\n /**\n * Return the opacity of the layer (between 0 and 1).\n * @return {number} The opacity of the layer.\n * @observable\n * @api\n */\n getOpacity() {\n return /** @type {number} */ (this.get(LayerProperty.OPACITY));\n }\n\n /**\n * @abstract\n * @return {import(\"../source/Source.js\").State} Source state.\n */\n getSourceState() {\n return abstract();\n }\n\n /**\n * Return the value of this layer's `visible` property. To find out whether the layer\n * is visible on a map, use `isVisible()` instead.\n * @return {boolean} The value of the `visible` property of the layer.\n * @observable\n * @api\n */\n getVisible() {\n return /** @type {boolean} */ (this.get(LayerProperty.VISIBLE));\n }\n\n /**\n * Return the Z-index of the layer, which is used to order layers before\n * rendering. Returns undefined if the layer is unmanaged.\n * @return {number|undefined} The Z-index of the layer.\n * @observable\n * @api\n */\n getZIndex() {\n return /** @type {number|undefined} */ (this.get(LayerProperty.Z_INDEX));\n }\n\n /**\n * Sets the background color.\n * @param {BackgroundColor} [background] Background color.\n */\n setBackground(background) {\n this.background_ = background;\n this.changed();\n }\n\n /**\n * Set the extent at which the layer is visible. If `undefined`, the layer\n * will be visible at all extents.\n * @param {import(\"../extent.js\").Extent|undefined} extent The extent of the layer.\n * @observable\n * @api\n */\n setExtent(extent) {\n this.set(LayerProperty.EXTENT, extent);\n }\n\n /**\n * Set the maximum resolution at which the layer is visible.\n * @param {number} maxResolution The maximum resolution of the layer.\n * @observable\n * @api\n */\n setMaxResolution(maxResolution) {\n this.set(LayerProperty.MAX_RESOLUTION, maxResolution);\n }\n\n /**\n * Set the minimum resolution at which the layer is visible.\n * @param {number} minResolution The minimum resolution of the layer.\n * @observable\n * @api\n */\n setMinResolution(minResolution) {\n this.set(LayerProperty.MIN_RESOLUTION, minResolution);\n }\n\n /**\n * Set the maximum zoom (exclusive) at which the layer is visible.\n * Note that the zoom levels for layer visibility are based on the\n * view zoom level, which may be different from a tile source zoom level.\n * @param {number} maxZoom The maximum zoom of the layer.\n * @observable\n * @api\n */\n setMaxZoom(maxZoom) {\n this.set(LayerProperty.MAX_ZOOM, maxZoom);\n }\n\n /**\n * Set the minimum zoom (inclusive) at which the layer is visible.\n * Note that the zoom levels for layer visibility are based on the\n * view zoom level, which may be different from a tile source zoom level.\n * @param {number} minZoom The minimum zoom of the layer.\n * @observable\n * @api\n */\n setMinZoom(minZoom) {\n this.set(LayerProperty.MIN_ZOOM, minZoom);\n }\n\n /**\n * Set the opacity of the layer, allowed values range from 0 to 1.\n * @param {number} opacity The opacity of the layer.\n * @observable\n * @api\n */\n setOpacity(opacity) {\n assert(typeof opacity === 'number', 'Layer opacity must be a number');\n this.set(LayerProperty.OPACITY, opacity);\n }\n\n /**\n * Set the visibility of the layer (`true` or `false`).\n * @param {boolean} visible The visibility of the layer.\n * @observable\n * @api\n */\n setVisible(visible) {\n this.set(LayerProperty.VISIBLE, visible);\n }\n\n /**\n * Set Z-index of the layer, which is used to order layers before rendering.\n * The default Z-index is 0.\n * @param {number} zindex The z-index of the layer.\n * @observable\n * @api\n */\n setZIndex(zindex) {\n this.set(LayerProperty.Z_INDEX, zindex);\n }\n\n /**\n * Clean up.\n * @override\n */\n disposeInternal() {\n if (this.state_) {\n this.state_.layer = null;\n this.state_ = null;\n }\n super.disposeInternal();\n }\n}\n\nexport default BaseLayer;\n","/**\n * @module ol/layer/Group\n */\nimport Collection from '../Collection.js';\nimport CollectionEventType from '../CollectionEventType.js';\nimport ObjectEventType from '../ObjectEventType.js';\nimport {assert} from '../asserts.js';\nimport {listen, unlistenByKey} from '../events.js';\nimport Event from '../events/Event.js';\nimport EventType from '../events/EventType.js';\nimport {getIntersection} from '../extent.js';\nimport {clear} from '../obj.js';\nimport {getUid} from '../util.js';\nimport BaseLayer from './Base.js';\n\n/**\n * @enum {string}\n */\nconst GroupEventType = {\n /**\n * Triggered when a layer is added\n * @event GroupEvent#addlayer\n * @api\n */\n ADDLAYER: 'addlayer',\n /**\n * Triggered when a layer is removed\n * @event GroupEvent#removelayer\n * @api\n */\n REMOVELAYER: 'removelayer',\n};\n\n/**\n * @classdesc\n * A layer group triggers 'addlayer' and 'removelayer' events when layers are added to or removed from\n * the group or one of its child groups. When a layer group is added to or removed from another layer group,\n * a single event will be triggered (instead of one per layer in the group added or removed).\n */\nexport class GroupEvent extends Event {\n /**\n * @param {GroupEventType} type The event type.\n * @param {BaseLayer} layer The layer.\n */\n constructor(type, layer) {\n super(type);\n\n /**\n * The added or removed layer.\n * @type {BaseLayer}\n * @api\n */\n this.layer = layer;\n }\n}\n\n/***\n * @template Return\n * @typedef {import(\"../Observable.js\").OnSignature &\n * import(\"../Observable.js\").OnSignature &\n * import(\"../Observable.js\").OnSignature<'addlayer'|'removelayer', GroupEvent, Return> &\n * import(\"../Observable.js\").CombinedOnSignature} GroupOnSignature\n */\n\n/**\n * @typedef {Object} Options\n * @property {number} [opacity=1] Opacity (0, 1).\n * @property {boolean} [visible=true] Visibility.\n * @property {import(\"../extent.js\").Extent} [extent] The bounding extent for layer rendering. The layer will not be\n * rendered outside of this extent.\n * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers\n * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed\n * for layers that are added to the map's `layers` collection, or `Infinity` when the layer's `setMap()`\n * method was used.\n * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be\n * visible.\n * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n * @property {Array|Collection} [layers] Child layers.\n * @property {Object} [properties] Arbitrary observable properties. Can be accessed with `#get()` and `#set()`.\n */\n\n/**\n * @enum {string}\n * @private\n */\nconst Property = {\n LAYERS: 'layers',\n};\n\n/**\n * @classdesc\n * A {@link module:ol/Collection~Collection} of layers that are handled together.\n *\n * A generic `change` event is triggered when the group/Collection changes.\n *\n * @fires GroupEvent\n * @api\n */\nclass LayerGroup extends BaseLayer {\n /**\n * @param {Options} [options] Layer options.\n */\n constructor(options) {\n options = options || {};\n const baseOptions = /** @type {Options} */ (Object.assign({}, options));\n delete baseOptions.layers;\n\n let layers = options.layers;\n\n super(baseOptions);\n\n /***\n * @type {GroupOnSignature}\n */\n this.on;\n\n /***\n * @type {GroupOnSignature}\n */\n this.once;\n\n /***\n * @type {GroupOnSignature}\n */\n this.un;\n\n /**\n * @private\n * @type {Array}\n */\n this.layersListenerKeys_ = [];\n\n /**\n * @private\n * @type {Object>}\n */\n this.listenerKeys_ = {};\n\n this.addChangeListener(Property.LAYERS, this.handleLayersChanged_);\n\n if (layers) {\n if (Array.isArray(layers)) {\n layers = new Collection(layers.slice(), {unique: true});\n } else {\n assert(\n typeof (/** @type {?} */ (layers).getArray) === 'function',\n 'Expected `layers` to be an array or a `Collection`',\n );\n }\n } else {\n layers = new Collection(undefined, {unique: true});\n }\n\n this.setLayers(layers);\n }\n\n /**\n * @private\n */\n handleLayerChange_() {\n this.changed();\n }\n\n /**\n * @private\n */\n handleLayersChanged_() {\n this.layersListenerKeys_.forEach(unlistenByKey);\n this.layersListenerKeys_.length = 0;\n\n const layers = this.getLayers();\n this.layersListenerKeys_.push(\n listen(layers, CollectionEventType.ADD, this.handleLayersAdd_, this),\n listen(\n layers,\n CollectionEventType.REMOVE,\n this.handleLayersRemove_,\n this,\n ),\n );\n\n for (const id in this.listenerKeys_) {\n this.listenerKeys_[id].forEach(unlistenByKey);\n }\n clear(this.listenerKeys_);\n\n const layersArray = layers.getArray();\n for (let i = 0, ii = layersArray.length; i < ii; i++) {\n const layer = layersArray[i];\n this.registerLayerListeners_(layer);\n this.dispatchEvent(new GroupEvent(GroupEventType.ADDLAYER, layer));\n }\n this.changed();\n }\n\n /**\n * @param {BaseLayer} layer The layer.\n */\n registerLayerListeners_(layer) {\n const listenerKeys = [\n listen(\n layer,\n ObjectEventType.PROPERTYCHANGE,\n this.handleLayerChange_,\n this,\n ),\n listen(layer, EventType.CHANGE, this.handleLayerChange_, this),\n ];\n\n if (layer instanceof LayerGroup) {\n listenerKeys.push(\n listen(layer, GroupEventType.ADDLAYER, this.handleLayerGroupAdd_, this),\n listen(\n layer,\n GroupEventType.REMOVELAYER,\n this.handleLayerGroupRemove_,\n this,\n ),\n );\n }\n\n this.listenerKeys_[getUid(layer)] = listenerKeys;\n }\n\n /**\n * @param {GroupEvent} event The layer group event.\n */\n handleLayerGroupAdd_(event) {\n this.dispatchEvent(new GroupEvent(GroupEventType.ADDLAYER, event.layer));\n }\n\n /**\n * @param {GroupEvent} event The layer group event.\n */\n handleLayerGroupRemove_(event) {\n this.dispatchEvent(new GroupEvent(GroupEventType.REMOVELAYER, event.layer));\n }\n\n /**\n * @param {import(\"../Collection.js\").CollectionEvent} collectionEvent CollectionEvent.\n * @private\n */\n handleLayersAdd_(collectionEvent) {\n const layer = collectionEvent.element;\n this.registerLayerListeners_(layer);\n this.dispatchEvent(new GroupEvent(GroupEventType.ADDLAYER, layer));\n this.changed();\n }\n\n /**\n * @param {import(\"../Collection.js\").CollectionEvent} collectionEvent CollectionEvent.\n * @private\n */\n handleLayersRemove_(collectionEvent) {\n const layer = collectionEvent.element;\n const key = getUid(layer);\n this.listenerKeys_[key].forEach(unlistenByKey);\n delete this.listenerKeys_[key];\n this.dispatchEvent(new GroupEvent(GroupEventType.REMOVELAYER, layer));\n this.changed();\n }\n\n /**\n * Returns the {@link module:ol/Collection~Collection collection} of {@link module:ol/layer/Layer~Layer layers}\n * in this group.\n * @return {!Collection} Collection of\n * {@link module:ol/layer/Base~BaseLayer layers} that are part of this group.\n * @observable\n * @api\n */\n getLayers() {\n return /** @type {!Collection} */ (\n this.get(Property.LAYERS)\n );\n }\n\n /**\n * Set the {@link module:ol/Collection~Collection collection} of {@link module:ol/layer/Layer~Layer layers}\n * in this group.\n * @param {!Collection} layers Collection of\n * {@link module:ol/layer/Base~BaseLayer layers} that are part of this group.\n * @observable\n * @api\n */\n setLayers(layers) {\n const collection = this.getLayers();\n if (collection) {\n const currentLayers = collection.getArray();\n for (let i = 0, ii = currentLayers.length; i < ii; ++i) {\n this.dispatchEvent(\n new GroupEvent(GroupEventType.REMOVELAYER, currentLayers[i]),\n );\n }\n }\n\n this.set(Property.LAYERS, layers);\n }\n\n /**\n * @param {Array} [array] Array of layers (to be modified in place).\n * @return {Array} Array of layers.\n * @override\n */\n getLayersArray(array) {\n array = array !== undefined ? array : [];\n this.getLayers().forEach(function (layer) {\n layer.getLayersArray(array);\n });\n return array;\n }\n\n /**\n * Get the layer states list and use this groups z-index as the default\n * for all layers in this and nested groups, if it is unset at this point.\n * If dest is not provided and this group's z-index is undefined\n * 0 is used a the default z-index.\n * @param {Array} [dest] Optional list\n * of layer states (to be modified in place).\n * @return {Array} List of layer states.\n * @override\n */\n getLayerStatesArray(dest) {\n const states = dest !== undefined ? dest : [];\n const pos = states.length;\n\n this.getLayers().forEach(function (layer) {\n layer.getLayerStatesArray(states);\n });\n\n const ownLayerState = this.getLayerState();\n let defaultZIndex = ownLayerState.zIndex;\n if (!dest && ownLayerState.zIndex === undefined) {\n defaultZIndex = 0;\n }\n for (let i = pos, ii = states.length; i < ii; i++) {\n const layerState = states[i];\n layerState.opacity *= ownLayerState.opacity;\n layerState.visible = layerState.visible && ownLayerState.visible;\n layerState.maxResolution = Math.min(\n layerState.maxResolution,\n ownLayerState.maxResolution,\n );\n layerState.minResolution = Math.max(\n layerState.minResolution,\n ownLayerState.minResolution,\n );\n layerState.minZoom = Math.max(layerState.minZoom, ownLayerState.minZoom);\n layerState.maxZoom = Math.min(layerState.maxZoom, ownLayerState.maxZoom);\n if (ownLayerState.extent !== undefined) {\n if (layerState.extent !== undefined) {\n layerState.extent = getIntersection(\n layerState.extent,\n ownLayerState.extent,\n );\n } else {\n layerState.extent = ownLayerState.extent;\n }\n }\n if (layerState.zIndex === undefined) {\n layerState.zIndex = defaultZIndex;\n }\n }\n\n return states;\n }\n\n /**\n * @return {import(\"../source/Source.js\").State} Source state.\n * @override\n */\n getSourceState() {\n return 'ready';\n }\n}\n\nexport default LayerGroup;\n","/**\n * @module ol/render/EventType\n */\n\n/**\n * @enum {string}\n */\nexport default {\n /**\n * Triggered before a layer is rendered.\n * @event module:ol/render/Event~RenderEvent#prerender\n * @api\n */\n PRERENDER: 'prerender',\n\n /**\n * Triggered after a layer is rendered.\n * @event module:ol/render/Event~RenderEvent#postrender\n * @api\n */\n POSTRENDER: 'postrender',\n\n /**\n * Triggered before layers are composed. When dispatched by the map, the event object will not have\n * a `context` set. When dispatched by a layer, the event object will have a `context` set. Only\n * WebGL layers currently dispatch this event.\n * @event module:ol/render/Event~RenderEvent#precompose\n * @api\n */\n PRECOMPOSE: 'precompose',\n\n /**\n * Triggered after layers are composed. When dispatched by the map, the event object will not have\n * a `context` set. When dispatched by a layer, the event object will have a `context` set. Only\n * WebGL layers currently dispatch this event.\n * @event module:ol/render/Event~RenderEvent#postcompose\n * @api\n */\n POSTCOMPOSE: 'postcompose',\n\n /**\n * Triggered when rendering is complete, i.e. all sources and tiles have\n * finished loading for the current viewport, and all tiles are faded in.\n * The event object will not have a `context` set.\n * @event module:ol/render/Event~RenderEvent#rendercomplete\n * @api\n */\n RENDERCOMPLETE: 'rendercomplete',\n};\n\n/**\n * @typedef {'postrender'|'precompose'|'postcompose'|'rendercomplete'} MapRenderEventTypes\n */\n\n/**\n * @typedef {'postrender'|'prerender'} LayerRenderEventTypes\n */\n","/**\n * @module ol/layer/Layer\n */\nimport View from '../View.js';\nimport {assert} from '../asserts.js';\nimport {listen, unlistenByKey} from '../events.js';\nimport EventType from '../events/EventType.js';\nimport {intersects} from '../extent.js';\nimport RenderEventType from '../render/EventType.js';\nimport BaseLayer from './Base.js';\nimport LayerProperty from './Property.js';\n\n/**\n * @typedef {function(import(\"../Map.js\").FrameState):HTMLElement} RenderFunction\n */\n\n/**\n * @typedef {'sourceready'|'change:source'} LayerEventType\n */\n\n/***\n * @template Return\n * @typedef {import(\"../Observable.js\").OnSignature &\n * import(\"../Observable.js\").OnSignature &\n * import(\"../Observable.js\").OnSignature &\n * import(\"../Observable.js\").CombinedOnSignature} LayerOnSignature\n */\n\n/**\n * @template {import(\"../source/Source.js\").default} [SourceType=import(\"../source/Source.js\").default]\n * @template {Object} [Properties=Object]\n * @typedef {Object} Options\n * @property {string} [className='ol-layer'] A CSS class name to set to the layer element.\n * @property {number} [opacity=1] Opacity (0, 1).\n * @property {boolean} [visible=true] Visibility.\n * @property {import(\"../extent.js\").Extent} [extent] The bounding extent for layer rendering. The layer will not be\n * rendered outside of this extent.\n * @property {number} [zIndex] The z-index for layer rendering. At rendering time, the layers\n * will be ordered, first by Z-index and then by position. When `undefined`, a `zIndex` of 0 is assumed\n * for layers that are added to the map's `layers` collection, or `Infinity` when the layer's `setMap()`\n * method was used.\n * @property {number} [minResolution] The minimum resolution (inclusive) at which this layer will be\n * visible.\n * @property {number} [maxResolution] The maximum resolution (exclusive) below which this layer will\n * be visible.\n * @property {number} [minZoom] The minimum view zoom level (exclusive) above which this layer will be\n * visible.\n * @property {number} [maxZoom] The maximum view zoom level (inclusive) at which this layer will\n * be visible.\n * @property {SourceType} [source] Source for this layer. If not provided to the constructor,\n * the source can be set by calling {@link module:ol/layer/Layer~Layer#setSource layer.setSource(source)} after\n * construction.\n * @property {import(\"../Map.js\").default|null} [map] Map.\n * @property {RenderFunction} [render] Render function. Takes the frame state as input and is expected to return an\n * HTML element. Will overwrite the default rendering for the layer.\n * @property {import(\"./Base.js\").BackgroundColor} [background] Background color for the layer. If not specified, no background\n * will be rendered.\n * @property {Properties} [properties] Arbitrary observable properties. Can be accessed with `#get()` and `#set()`.\n */\n\n/**\n * @typedef {Object} State\n * @property {import(\"./Layer.js\").default} layer Layer.\n * @property {number} opacity Opacity, the value is rounded to two digits to appear after the decimal point.\n * @property {boolean} visible Visible.\n * @property {boolean} managed Managed.\n * @property {import(\"../extent.js\").Extent} [extent] Extent.\n * @property {number} zIndex ZIndex.\n * @property {number} maxResolution Maximum resolution.\n * @property {number} minResolution Minimum resolution.\n * @property {number} minZoom Minimum zoom.\n * @property {number} maxZoom Maximum zoom.\n */\n\n/**\n * @classdesc\n * Base class from which all layer types are derived. This should only be instantiated\n * in the case where a custom layer is added to the map with a custom `render` function.\n * Such a function can be specified in the `options` object, and is expected to return an HTML element.\n *\n * A visual representation of raster or vector map data.\n * Layers group together those properties that pertain to how the data is to be\n * displayed, irrespective of the source of that data.\n *\n * Layers are usually added to a map with [map.addLayer()]{@link import(\"../Map.js\").default#addLayer}.\n * Components like {@link module:ol/interaction/Draw~Draw} use unmanaged layers\n * internally. These unmanaged layers are associated with the map using\n * [layer.setMap()]{@link module:ol/layer/Layer~Layer#setMap} instead.\n *\n * A generic `change` event is fired when the state of the source changes.\n * A `sourceready` event is fired when the layer's source is ready.\n *\n * @fires import(\"../render/Event.js\").RenderEvent#prerender\n * @fires import(\"../render/Event.js\").RenderEvent#postrender\n * @fires import(\"../events/Event.js\").BaseEvent#sourceready\n *\n * @template {import(\"../source/Source.js\").default} [SourceType=import(\"../source/Source.js\").default]\n * @template {import(\"../renderer/Layer.js\").default} [RendererType=import(\"../renderer/Layer.js\").default]\n * @template {Object} [Properties=Object]\n * @extends {BaseLayer>}\n * @api\n */\nclass Layer extends BaseLayer {\n /**\n * @param {Options>} options Layer options.\n */\n constructor(options) {\n const baseOptions = Object.assign({}, options);\n delete baseOptions.source;\n\n super(baseOptions);\n\n /***\n * @type {LayerOnSignature}\n */\n this.on;\n\n /***\n * @type {LayerOnSignature}\n */\n this.once;\n\n /***\n * @type {LayerOnSignature}\n */\n this.un;\n\n /**\n * @private\n * @type {?import(\"../events.js\").EventsKey}\n */\n this.mapPrecomposeKey_ = null;\n\n /**\n * @private\n * @type {?import(\"../events.js\").EventsKey}\n */\n this.mapRenderKey_ = null;\n\n /**\n * @private\n * @type {?import(\"../events.js\").EventsKey}\n */\n this.sourceChangeKey_ = null;\n\n /**\n * @private\n * @type {RendererType}\n */\n this.renderer_ = null;\n\n /**\n * @private\n * @type {boolean}\n */\n this.sourceReady_ = false;\n\n /**\n * @protected\n * @type {boolean}\n */\n this.rendered = false;\n\n // Overwrite default render method with a custom one\n if (options.render) {\n this.render = options.render;\n }\n\n if (options.map) {\n this.setMap(options.map);\n }\n\n this.addChangeListener(\n LayerProperty.SOURCE,\n this.handleSourcePropertyChange_,\n );\n\n const source = options.source\n ? /** @type {SourceType} */ (options.source)\n : null;\n this.setSource(source);\n }\n\n /**\n * @param {Array} [array] Array of layers (to be modified in place).\n * @return {Array} Array of layers.\n * @override\n */\n getLayersArray(array) {\n array = array ? array : [];\n array.push(this);\n return array;\n }\n\n /**\n * @param {Array} [states] Optional list of layer states (to be modified in place).\n * @return {Array} List of layer states.\n * @override\n */\n getLayerStatesArray(states) {\n states = states ? states : [];\n states.push(this.getLayerState());\n return states;\n }\n\n /**\n * Get the layer source.\n * @return {SourceType|null} The layer source (or `null` if not yet set).\n * @observable\n * @api\n */\n getSource() {\n return /** @type {SourceType} */ (this.get(LayerProperty.SOURCE)) || null;\n }\n\n /**\n * @return {SourceType|null} The source being rendered.\n */\n getRenderSource() {\n return this.getSource();\n }\n\n /**\n * @return {import(\"../source/Source.js\").State} Source state.\n * @override\n */\n getSourceState() {\n const source = this.getSource();\n return !source ? 'undefined' : source.getState();\n }\n\n /**\n * @private\n */\n handleSourceChange_() {\n this.changed();\n if (this.sourceReady_ || this.getSource().getState() !== 'ready') {\n return;\n }\n this.sourceReady_ = true;\n this.dispatchEvent('sourceready');\n }\n\n /**\n * @private\n */\n handleSourcePropertyChange_() {\n if (this.sourceChangeKey_) {\n unlistenByKey(this.sourceChangeKey_);\n this.sourceChangeKey_ = null;\n }\n this.sourceReady_ = false;\n const source = this.getSource();\n if (source) {\n this.sourceChangeKey_ = listen(\n source,\n EventType.CHANGE,\n this.handleSourceChange_,\n this,\n );\n if (source.getState() === 'ready') {\n this.sourceReady_ = true;\n setTimeout(() => {\n this.dispatchEvent('sourceready');\n }, 0);\n }\n }\n this.changed();\n }\n\n /**\n * @param {import(\"../pixel.js\").Pixel} pixel Pixel.\n * @return {Promise>} Promise that resolves with\n * an array of features.\n */\n getFeatures(pixel) {\n if (!this.renderer_) {\n return Promise.resolve([]);\n }\n return this.renderer_.getFeatures(pixel);\n }\n\n /**\n * @param {import(\"../pixel.js\").Pixel} pixel Pixel.\n * @return {Uint8ClampedArray|Uint8Array|Float32Array|DataView|null} Pixel data.\n */\n getData(pixel) {\n if (!this.renderer_ || !this.rendered) {\n return null;\n }\n return this.renderer_.getData(pixel);\n }\n\n /**\n * The layer is visible on the map view, i.e. within its min/max resolution or zoom and\n * extent, not set to `visible: false`, and not inside a layer group that is set\n * to `visible: false`.\n * @param {View|import(\"../View.js\").ViewStateLayerStateExtent} [view] View or {@link import(\"../Map.js\").FrameState}.\n * Only required when the layer is not added to a map.\n * @return {boolean} The layer is visible in the map view.\n * @api\n */\n isVisible(view) {\n let frameState;\n const map = this.getMapInternal();\n if (!view && map) {\n view = map.getView();\n }\n if (view instanceof View) {\n frameState = {\n viewState: view.getState(),\n extent: view.calculateExtent(),\n };\n } else {\n frameState = view;\n }\n if (!frameState.layerStatesArray && map) {\n frameState.layerStatesArray = map.getLayerGroup().getLayerStatesArray();\n }\n let layerState;\n if (frameState.layerStatesArray) {\n layerState = frameState.layerStatesArray.find(\n (layerState) => layerState.layer === this,\n );\n if (!layerState) {\n return false;\n }\n } else {\n layerState = this.getLayerState();\n }\n\n const layerExtent = this.getExtent();\n\n return (\n inView(layerState, frameState.viewState) &&\n (!layerExtent || intersects(layerExtent, frameState.extent))\n );\n }\n\n /**\n * Get the attributions of the source of this layer for the given view.\n * @param {View|import(\"../View.js\").ViewStateLayerStateExtent} [view] View or {@link import(\"../Map.js\").FrameState}.\n * Only required when the layer is not added to a map.\n * @return {Array} Attributions for this layer at the given view.\n * @api\n */\n getAttributions(view) {\n if (!this.isVisible(view)) {\n return [];\n }\n const getAttributions = this.getSource()?.getAttributions();\n if (!getAttributions) {\n return [];\n }\n const frameState =\n view instanceof View ? view.getViewStateAndExtent() : view;\n let attributions = getAttributions(frameState);\n if (!Array.isArray(attributions)) {\n attributions = [attributions];\n }\n return attributions;\n }\n\n /**\n * In charge to manage the rendering of the layer. One layer type is\n * bounded with one layer renderer.\n * @param {?import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {HTMLElement} target Target which the renderer may (but need not) use\n * for rendering its content.\n * @return {HTMLElement|null} The rendered element.\n */\n render(frameState, target) {\n const layerRenderer = this.getRenderer();\n\n if (layerRenderer.prepareFrame(frameState)) {\n this.rendered = true;\n return layerRenderer.renderFrame(frameState, target);\n }\n return null;\n }\n\n /**\n * Called when a layer is not visible during a map render.\n */\n unrender() {\n this.rendered = false;\n }\n\n /** @return {string} Declutter */\n getDeclutter() {\n return undefined;\n }\n\n /**\n * @param {import(\"../Map.js\").FrameState} frameState Frame state.\n * @param {import(\"../layer/Layer.js\").State} layerState Layer state.\n */\n renderDeclutter(frameState, layerState) {}\n\n /**\n * When the renderer follows a layout -> render approach, do the final rendering here.\n * @param {import('../Map.js').FrameState} frameState Frame state\n */\n renderDeferred(frameState) {\n const layerRenderer = this.getRenderer();\n if (!layerRenderer) {\n return;\n }\n layerRenderer.renderDeferred(frameState);\n }\n\n /**\n * For use inside the library only.\n * @param {import(\"../Map.js\").default|null} map Map.\n */\n setMapInternal(map) {\n if (!map) {\n this.unrender();\n }\n this.set(LayerProperty.MAP, map);\n }\n\n /**\n * For use inside the library only.\n * @return {import(\"../Map.js\").default|null} Map.\n */\n getMapInternal() {\n return this.get(LayerProperty.MAP);\n }\n\n /**\n * Sets the layer to be rendered on top of other layers on a map. The map will\n * not manage this layer in its layers collection. This\n * is useful for temporary layers. To remove an unmanaged layer from the map,\n * use `#setMap(null)`.\n *\n * To add the layer to a map and have it managed by the map, use\n * {@link module:ol/Map~Map#addLayer} instead.\n * @param {import(\"../Map.js\").default|null} map Map.\n * @api\n */\n setMap(map) {\n if (this.mapPrecomposeKey_) {\n unlistenByKey(this.mapPrecomposeKey_);\n this.mapPrecomposeKey_ = null;\n }\n if (!map) {\n this.changed();\n }\n if (this.mapRenderKey_) {\n unlistenByKey(this.mapRenderKey_);\n this.mapRenderKey_ = null;\n }\n if (map) {\n this.mapPrecomposeKey_ = listen(\n map,\n RenderEventType.PRECOMPOSE,\n this.handlePrecompose_,\n this,\n );\n this.mapRenderKey_ = listen(this, EventType.CHANGE, map.render, map);\n this.changed();\n }\n }\n\n /**\n * @param {import(\"../events/Event.js\").default} renderEvent Render event\n * @private\n */\n handlePrecompose_(renderEvent) {\n const layerStatesArray =\n /** @type {import(\"../render/Event.js\").default} */ (renderEvent)\n .frameState.layerStatesArray;\n const layerState = this.getLayerState(false);\n assert(\n !layerStatesArray.some(\n (arrayLayerState) => arrayLayerState.layer === layerState.layer,\n ),\n 'A layer can only be added to the map once. Use either `layer.setMap()` or `map.addLayer()`, not both.',\n );\n layerStatesArray.push(layerState);\n }\n\n /**\n * Set the layer source.\n * @param {SourceType|null} source The layer source.\n * @observable\n * @api\n */\n setSource(source) {\n this.set(LayerProperty.SOURCE, source);\n }\n\n /**\n * Get the renderer for this layer.\n * @return {RendererType|null} The layer renderer.\n */\n getRenderer() {\n if (!this.renderer_) {\n this.renderer_ = this.createRenderer();\n }\n return this.renderer_;\n }\n\n /**\n * @return {boolean} The layer has a renderer.\n */\n hasRenderer() {\n return !!this.renderer_;\n }\n\n /**\n * Create a renderer for this layer.\n * @return {RendererType} A layer renderer.\n * @protected\n */\n createRenderer() {\n return null;\n }\n\n /**\n * This will clear the renderer so that a new one can be created next time it is needed\n */\n clearRenderer() {\n if (this.renderer_) {\n this.renderer_.dispose();\n delete this.renderer_;\n }\n }\n\n /**\n * Clean up.\n * @override\n */\n disposeInternal() {\n this.clearRenderer();\n this.setSource(null);\n super.disposeInternal();\n }\n}\n\n/**\n * Return `true` if the layer is visible and if the provided view state\n * has resolution and zoom levels that are in range of the layer's min/max.\n * @param {State} layerState Layer state.\n * @param {import(\"../View.js\").State} viewState View state.\n * @return {boolean} The layer is visible at the given view state.\n */\nexport function inView(layerState, viewState) {\n if (!layerState.visible) {\n return false;\n }\n const resolution = viewState.resolution;\n if (\n resolution < layerState.minResolution ||\n resolution >= layerState.maxResolution\n ) {\n return false;\n }\n const zoom = viewState.zoom;\n return zoom > layerState.minZoom && zoom <= layerState.maxZoom;\n}\n\nexport default Layer;\n","\n/**\n * Rearranges items so that all items in the [left, k] are the smallest.\n * The k-th element will have the (k - left + 1)-th smallest value in [left, right].\n *\n * @template T\n * @param {T[]} arr the array to partially sort (in place)\n * @param {number} k middle index for partial sorting (as defined above)\n * @param {number} [left=0] left index of the range to sort\n * @param {number} [right=arr.length-1] right index\n * @param {(a: T, b: T) => number} [compare = (a, b) => a - b] compare function\n */\nexport default function quickselect(arr, k, left = 0, right = arr.length - 1, compare = defaultCompare) {\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 quickselect(arr, k, newLeft, newRight, compare);\n }\n\n const t = arr[k];\n let i = left;\n /** @type {number} */\n let 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\n/**\n * @template T\n * @param {T[]} 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 * @template T\n * @param {T} a\n * @param {T} b\n * @returns {number}\n */\nfunction defaultCompare(a, b) {\n return a < b ? -1 : a > b ? 1 : 0;\n}\n","import quickselect from 'quickselect';\n\nexport default class RBush {\n constructor(maxEntries = 9) {\n // max entries in a node is 9 by default; min node fill is 40% for best performance\n this._maxEntries = Math.max(4, maxEntries);\n this._minEntries = Math.max(2, Math.ceil(this._maxEntries * 0.4));\n this.clear();\n }\n\n all() {\n return this._all(this.data, []);\n }\n\n search(bbox) {\n let node = this.data;\n const result = [];\n\n if (!intersects(bbox, node)) return result;\n\n const toBBox = this.toBBox;\n const nodesToSearch = [];\n\n while (node) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childBBox = node.leaf ? toBBox(child) : child;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf) result.push(child);\n else if (contains(bbox, childBBox)) this._all(child, result);\n else nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return result;\n }\n\n collides(bbox) {\n let node = this.data;\n\n if (!intersects(bbox, node)) return false;\n\n const nodesToSearch = [];\n while (node) {\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const childBBox = node.leaf ? this.toBBox(child) : child;\n\n if (intersects(bbox, childBBox)) {\n if (node.leaf || contains(bbox, childBBox)) return true;\n nodesToSearch.push(child);\n }\n }\n node = nodesToSearch.pop();\n }\n\n return false;\n }\n\n load(data) {\n if (!(data && data.length)) return this;\n\n if (data.length < this._minEntries) {\n for (let i = 0; i < data.length; i++) {\n this.insert(data[i]);\n }\n return this;\n }\n\n // recursively build the tree with the given data from scratch using OMT algorithm\n let node = this._build(data.slice(), 0, data.length - 1, 0);\n\n if (!this.data.children.length) {\n // save as is if tree is empty\n this.data = node;\n\n } else if (this.data.height === node.height) {\n // split root if trees have the same height\n this._splitRoot(this.data, node);\n\n } else {\n if (this.data.height < node.height) {\n // swap trees if inserted one is bigger\n const tmpNode = this.data;\n this.data = node;\n node = tmpNode;\n }\n\n // insert the small tree into the large tree at appropriate level\n this._insert(node, this.data.height - node.height - 1, true);\n }\n\n return this;\n }\n\n insert(item) {\n if (item) this._insert(item, this.data.height - 1);\n return this;\n }\n\n clear() {\n this.data = createNode([]);\n return this;\n }\n\n remove(item, equalsFn) {\n if (!item) return this;\n\n let node = this.data;\n const bbox = this.toBBox(item);\n const path = [];\n const indexes = [];\n let i, parent, goingUp;\n\n // depth-first iterative tree traversal\n while (node || path.length) {\n\n if (!node) { // go up\n node = path.pop();\n parent = path[path.length - 1];\n i = indexes.pop();\n goingUp = true;\n }\n\n if (node.leaf) { // check current node\n const index = findItem(item, node.children, equalsFn);\n\n if (index !== -1) {\n // item found, remove the item and condense tree upwards\n node.children.splice(index, 1);\n path.push(node);\n this._condense(path);\n return this;\n }\n }\n\n if (!goingUp && !node.leaf && contains(node, bbox)) { // go down\n path.push(node);\n indexes.push(i);\n i = 0;\n parent = node;\n node = node.children[0];\n\n } else if (parent) { // go right\n i++;\n node = parent.children[i];\n goingUp = false;\n\n } else node = null; // nothing found\n }\n\n return this;\n }\n\n toBBox(item) { return item; }\n\n compareMinX(a, b) { return a.minX - b.minX; }\n compareMinY(a, b) { return a.minY - b.minY; }\n\n toJSON() { return this.data; }\n\n fromJSON(data) {\n this.data = data;\n return this;\n }\n\n _all(node, result) {\n const nodesToSearch = [];\n while (node) {\n if (node.leaf) result.push(...node.children);\n else nodesToSearch.push(...node.children);\n\n node = nodesToSearch.pop();\n }\n return result;\n }\n\n _build(items, left, right, height) {\n\n const N = right - left + 1;\n let M = this._maxEntries;\n let node;\n\n if (N <= M) {\n // reached leaf level; return leaf\n node = createNode(items.slice(left, right + 1));\n calcBBox(node, this.toBBox);\n return node;\n }\n\n if (!height) {\n // target height of the bulk-loaded tree\n height = Math.ceil(Math.log(N) / Math.log(M));\n\n // target number of root entries to maximize storage utilization\n M = Math.ceil(N / Math.pow(M, height - 1));\n }\n\n node = createNode([]);\n node.leaf = false;\n node.height = height;\n\n // split the items into M mostly square tiles\n\n const N2 = Math.ceil(N / M);\n const N1 = N2 * Math.ceil(Math.sqrt(M));\n\n multiSelect(items, left, right, N1, this.compareMinX);\n\n for (let i = left; i <= right; i += N1) {\n\n const right2 = Math.min(i + N1 - 1, right);\n\n multiSelect(items, i, right2, N2, this.compareMinY);\n\n for (let j = i; j <= right2; j += N2) {\n\n const right3 = Math.min(j + N2 - 1, right2);\n\n // pack each entry recursively\n node.children.push(this._build(items, j, right3, height - 1));\n }\n }\n\n calcBBox(node, this.toBBox);\n\n return node;\n }\n\n _chooseSubtree(bbox, node, level, path) {\n while (true) {\n path.push(node);\n\n if (node.leaf || path.length - 1 === level) break;\n\n let minArea = Infinity;\n let minEnlargement = Infinity;\n let targetNode;\n\n for (let i = 0; i < node.children.length; i++) {\n const child = node.children[i];\n const area = bboxArea(child);\n const enlargement = enlargedArea(bbox, child) - area;\n\n // choose entry with the least area enlargement\n if (enlargement < minEnlargement) {\n minEnlargement = enlargement;\n minArea = area < minArea ? area : minArea;\n targetNode = child;\n\n } else if (enlargement === minEnlargement) {\n // otherwise choose one with the smallest area\n if (area < minArea) {\n minArea = area;\n targetNode = child;\n }\n }\n }\n\n node = targetNode || node.children[0];\n }\n\n return node;\n }\n\n _insert(item, level, isNode) {\n const bbox = isNode ? item : this.toBBox(item);\n const insertPath = [];\n\n // find the best node for accommodating the item, saving all nodes along the path too\n const node = this._chooseSubtree(bbox, this.data, level, insertPath);\n\n // put the item into the node\n node.children.push(item);\n extend(node, bbox);\n\n // split on node overflow; propagate upwards if necessary\n while (level >= 0) {\n if (insertPath[level].children.length > this._maxEntries) {\n this._split(insertPath, level);\n level--;\n } else break;\n }\n\n // adjust bboxes along the insertion path\n this._adjustParentBBoxes(bbox, insertPath, level);\n }\n\n // split overflowed node into two\n _split(insertPath, level) {\n const node = insertPath[level];\n const M = node.children.length;\n const m = this._minEntries;\n\n this._chooseSplitAxis(node, m, M);\n\n const splitIndex = this._chooseSplitIndex(node, m, M);\n\n const newNode = createNode(node.children.splice(splitIndex, node.children.length - splitIndex));\n newNode.height = node.height;\n newNode.leaf = node.leaf;\n\n calcBBox(node, this.toBBox);\n calcBBox(newNode, this.toBBox);\n\n if (level) insertPath[level - 1].children.push(newNode);\n else this._splitRoot(node, newNode);\n }\n\n _splitRoot(node, newNode) {\n // split root node\n this.data = createNode([node, newNode]);\n this.data.height = node.height + 1;\n this.data.leaf = false;\n calcBBox(this.data, this.toBBox);\n }\n\n _chooseSplitIndex(node, m, M) {\n let index;\n let minOverlap = Infinity;\n let minArea = Infinity;\n\n for (let i = m; i <= M - m; i++) {\n const bbox1 = distBBox(node, 0, i, this.toBBox);\n const bbox2 = distBBox(node, i, M, this.toBBox);\n\n const overlap = intersectionArea(bbox1, bbox2);\n const area = bboxArea(bbox1) + bboxArea(bbox2);\n\n // choose distribution with minimum overlap\n if (overlap < minOverlap) {\n minOverlap = overlap;\n index = i;\n\n minArea = area < minArea ? area : minArea;\n\n } else if (overlap === minOverlap) {\n // otherwise choose distribution with minimum area\n if (area < minArea) {\n minArea = area;\n index = i;\n }\n }\n }\n\n return index || M - m;\n }\n\n // sorts node children by the best axis for split\n _chooseSplitAxis(node, m, M) {\n const compareMinX = node.leaf ? this.compareMinX : compareNodeMinX;\n const compareMinY = node.leaf ? this.compareMinY : compareNodeMinY;\n const xMargin = this._allDistMargin(node, m, M, compareMinX);\n const yMargin = this._allDistMargin(node, m, M, compareMinY);\n\n // if total distributions margin value is minimal for x, sort by minX,\n // otherwise it's already sorted by minY\n if (xMargin < yMargin) node.children.sort(compareMinX);\n }\n\n // total margin of all possible split distributions where each node is at least m full\n _allDistMargin(node, m, M, compare) {\n node.children.sort(compare);\n\n const toBBox = this.toBBox;\n const leftBBox = distBBox(node, 0, m, toBBox);\n const rightBBox = distBBox(node, M - m, M, toBBox);\n let margin = bboxMargin(leftBBox) + bboxMargin(rightBBox);\n\n for (let i = m; i < M - m; i++) {\n const child = node.children[i];\n extend(leftBBox, node.leaf ? toBBox(child) : child);\n margin += bboxMargin(leftBBox);\n }\n\n for (let i = M - m - 1; i >= m; i--) {\n const child = node.children[i];\n extend(rightBBox, node.leaf ? toBBox(child) : child);\n margin += bboxMargin(rightBBox);\n }\n\n return margin;\n }\n\n _adjustParentBBoxes(bbox, path, level) {\n // adjust bboxes along the given tree path\n for (let i = level; i >= 0; i--) {\n extend(path[i], bbox);\n }\n }\n\n _condense(path) {\n // go through the path, removing empty nodes and updating bboxes\n for (let i = path.length - 1, siblings; i >= 0; i--) {\n if (path[i].children.length === 0) {\n if (i > 0) {\n siblings = path[i - 1].children;\n siblings.splice(siblings.indexOf(path[i]), 1);\n\n } else this.clear();\n\n } else calcBBox(path[i], this.toBBox);\n }\n }\n}\n\nfunction findItem(item, items, equalsFn) {\n if (!equalsFn) return items.indexOf(item);\n\n for (let i = 0; i < items.length; i++) {\n if (equalsFn(item, items[i])) return i;\n }\n return -1;\n}\n\n// calculate node's bbox from bboxes of its children\nfunction calcBBox(node, toBBox) {\n distBBox(node, 0, node.children.length, toBBox, node);\n}\n\n// min bounding rectangle of node children from k to p-1\nfunction distBBox(node, k, p, toBBox, destNode) {\n if (!destNode) destNode = createNode(null);\n destNode.minX = Infinity;\n destNode.minY = Infinity;\n destNode.maxX = -Infinity;\n destNode.maxY = -Infinity;\n\n for (let i = k; i < p; i++) {\n const child = node.children[i];\n extend(destNode, node.leaf ? toBBox(child) : child);\n }\n\n return destNode;\n}\n\nfunction extend(a, b) {\n a.minX = Math.min(a.minX, b.minX);\n a.minY = Math.min(a.minY, b.minY);\n a.maxX = Math.max(a.maxX, b.maxX);\n a.maxY = Math.max(a.maxY, b.maxY);\n return a;\n}\n\nfunction compareNodeMinX(a, b) { return a.minX - b.minX; }\nfunction compareNodeMinY(a, b) { return a.minY - b.minY; }\n\nfunction bboxArea(a) { return (a.maxX - a.minX) * (a.maxY - a.minY); }\nfunction bboxMargin(a) { return (a.maxX - a.minX) + (a.maxY - a.minY); }\n\nfunction enlargedArea(a, b) {\n return (Math.max(b.maxX, a.maxX) - Math.min(b.minX, a.minX)) *\n (Math.max(b.maxY, a.maxY) - Math.min(b.minY, a.minY));\n}\n\nfunction intersectionArea(a, b) {\n const minX = Math.max(a.minX, b.minX);\n const minY = Math.max(a.minY, b.minY);\n const maxX = Math.min(a.maxX, b.maxX);\n const maxY = Math.min(a.maxY, b.maxY);\n\n return Math.max(0, maxX - minX) *\n Math.max(0, maxY - minY);\n}\n\nfunction contains(a, b) {\n return a.minX <= b.minX &&\n a.minY <= b.minY &&\n b.maxX <= a.maxX &&\n b.maxY <= a.maxY;\n}\n\nfunction intersects(a, b) {\n return b.minX <= a.maxX &&\n b.minY <= a.maxY &&\n b.maxX >= a.minX &&\n b.maxY >= a.minY;\n}\n\nfunction createNode(children) {\n return {\n children,\n height: 1,\n leaf: true,\n minX: Infinity,\n minY: Infinity,\n maxX: -Infinity,\n maxY: -Infinity\n };\n}\n\n// sort an array so that items come in groups of n unsorted items, with groups sorted between each other;\n// combines selection algorithm with binary divide & conquer approach\n\nfunction multiSelect(arr, left, right, n, compare) {\n const stack = [left, right];\n\n while (stack.length) {\n right = stack.pop();\n left = stack.pop();\n\n if (right - left <= n) continue;\n\n const mid = left + Math.ceil((right - left) / n / 2) * n;\n quickselect(arr, mid, left, right, compare);\n\n stack.push(left, mid, mid, right);\n }\n}\n","/**\n * @module ol/color\n */\nimport {createCanvasContext2D} from './dom.js';\nimport {clamp, toFixed} from './math.js';\n\n/**\n * A color represented as a short array [red, green, blue, alpha].\n * red, green, and blue should be integers in the range 0..255 inclusive.\n * alpha should be a float in the range 0..1 inclusive. If no alpha value is\n * given then `1` will be used.\n * @typedef {Array} Color\n * @api\n */\n\n/**\n * Color to indicate that no color should be rendered. This is meant to be used for per-reference\n * comparisons only.\n * @type {Color}\n */\nexport const NO_COLOR = [NaN, NaN, NaN, 0];\n\nlet colorParseContext;\n/**\n * @return {CanvasRenderingContext2D} The color parse context\n */\nfunction getColorParseContext() {\n if (!colorParseContext) {\n colorParseContext = createCanvasContext2D(1, 1, undefined, {\n willReadFrequently: true,\n desynchronized: true,\n });\n }\n return colorParseContext;\n}\n\nconst rgbModernRegEx =\n /^rgba?\\(\\s*(\\d+%?)\\s+(\\d+%?)\\s+(\\d+%?)(?:\\s*\\/\\s*(\\d+%|\\d*\\.\\d+|[01]))?\\s*\\)$/i;\nconst rgbLegacyAbsoluteRegEx =\n /^rgba?\\(\\s*(\\d+)\\s*,\\s*(\\d+)\\s*,\\s*(\\d+)(?:\\s*,\\s*(\\d+%|\\d*\\.\\d+|[01]))?\\s*\\)$/i;\nconst rgbLegacyPercentageRegEx =\n /^rgba?\\(\\s*(\\d+%)\\s*,\\s*(\\d+%)\\s*,\\s*(\\d+%)(?:\\s*,\\s*(\\d+%|\\d*\\.\\d+|[01]))?\\s*\\)$/i;\nconst hexRegEx = /^#([\\da-f]{3,4}|[\\da-f]{6}|[\\da-f]{8})$/i;\n\n/**\n * @param {string} s Color component as number or percentage.\n * @param {number} divider Divider for percentage.\n * @return {number} Color component.\n */\nfunction toColorComponent(s, divider) {\n return s.endsWith('%')\n ? Number(s.substring(0, s.length - 1)) / divider\n : Number(s);\n}\n\n/**\n * @param {string} color Color string.\n */\nfunction throwInvalidColor(color) {\n throw new Error('failed to parse \"' + color + '\" as color');\n}\n\n/**\n * @param {string} color Color string.\n * @return {Color} RGBa color array.\n */\nfunction parseRgba(color) {\n // Fast lane for rgb(a) colors\n if (color.toLowerCase().startsWith('rgb')) {\n const rgb =\n color.match(rgbLegacyAbsoluteRegEx) ||\n color.match(rgbModernRegEx) ||\n color.match(rgbLegacyPercentageRegEx);\n if (rgb) {\n const alpha = rgb[4];\n const rgbDivider = 100 / 255;\n return [\n clamp((toColorComponent(rgb[1], rgbDivider) + 0.5) | 0, 0, 255),\n clamp((toColorComponent(rgb[2], rgbDivider) + 0.5) | 0, 0, 255),\n clamp((toColorComponent(rgb[3], rgbDivider) + 0.5) | 0, 0, 255),\n alpha !== undefined ? clamp(toColorComponent(alpha, 100), 0, 1) : 1,\n ];\n }\n throwInvalidColor(color);\n }\n // Fast lane for hex colors (also with alpha)\n if (color.startsWith('#')) {\n if (hexRegEx.test(color)) {\n const hex = color.substring(1);\n const step = hex.length <= 4 ? 1 : 2;\n const colorFromHex = [0, 0, 0, 255];\n for (let i = 0, ii = hex.length; i < ii; i += step) {\n let colorComponent = parseInt(hex.substring(i, i + step), 16);\n if (step === 1) {\n colorComponent += colorComponent << 4;\n }\n colorFromHex[i / step] = colorComponent;\n }\n colorFromHex[3] = colorFromHex[3] / 255;\n return colorFromHex;\n }\n throwInvalidColor(color);\n }\n // Use canvas color serialization to parse the color into hex or rgba\n // See https://www.w3.org/TR/2021/SPSD-2dcontext-20210128/#serialization-of-a-color\n const context = getColorParseContext();\n context.fillStyle = '#abcdef';\n let invalidCheckFillStyle = context.fillStyle;\n context.fillStyle = color;\n if (context.fillStyle === invalidCheckFillStyle) {\n context.fillStyle = '#fedcba';\n invalidCheckFillStyle = context.fillStyle;\n context.fillStyle = color;\n if (context.fillStyle === invalidCheckFillStyle) {\n throwInvalidColor(color);\n }\n }\n const colorString = context.fillStyle;\n if (colorString.startsWith('#') || colorString.startsWith('rgba')) {\n return parseRgba(colorString);\n }\n context.clearRect(0, 0, 1, 1);\n context.fillRect(0, 0, 1, 1);\n const colorFromImage = Array.from(context.getImageData(0, 0, 1, 1).data);\n colorFromImage[3] = toFixed(colorFromImage[3] / 255, 3);\n return colorFromImage;\n}\n\n/**\n * Return the color as an rgba string.\n * @param {Color|string} color Color.\n * @return {string} Rgba string.\n * @api\n */\nexport function asString(color) {\n if (typeof color === 'string') {\n return color;\n }\n return toString(color);\n}\n\n/**\n * @type {number}\n */\nconst MAX_CACHE_SIZE = 1024;\n\n/**\n * We maintain a small cache of parsed strings. Whenever the cache grows too large,\n * we delete an arbitrary set of the entries.\n *\n * @type {Object}\n */\nconst cache = {};\n\n/**\n * @type {number}\n */\nlet cacheSize = 0;\n\n/**\n * @param {Color} color A color that may or may not have an alpha channel.\n * @return {Color} The input color with an alpha channel. If the input color has\n * an alpha channel, the input color will be returned unchanged. Otherwise, a new\n * array will be returned with the input color and an alpha channel of 1.\n */\nexport function withAlpha(color) {\n if (color.length === 4) {\n return color;\n }\n const output = color.slice();\n output[3] = 1;\n return output;\n}\n\n// The functions b1, b2, a1, a2, rgbaToLcha and lchaToRgba below are adapted from\n// https://stackoverflow.com/a/67219995/2389327\n\n/**\n * @param {number} v Input value.\n * @return {number} Output value.\n */\nfunction b1(v) {\n return v > 0.0031308 ? Math.pow(v, 1 / 2.4) * 269.025 - 14.025 : v * 3294.6;\n}\n\n/**\n * @param {number} v Input value.\n * @return {number} Output value.\n */\nfunction b2(v) {\n return v > 0.2068965 ? Math.pow(v, 3) : (v - 4 / 29) * (108 / 841);\n}\n\n/**\n * @param {number} v Input value.\n * @return {number} Output value.\n */\nfunction a1(v) {\n return v > 10.314724 ? Math.pow((v + 14.025) / 269.025, 2.4) : v / 3294.6;\n}\n\n/**\n * @param {number} v Input value.\n * @return {number} Output value.\n */\nfunction a2(v) {\n return v > 0.0088564 ? Math.pow(v, 1 / 3) : v / (108 / 841) + 4 / 29;\n}\n\n/**\n * @param {Color} color RGBA color.\n * @return {Color} LCHuv color with alpha.\n */\nexport function rgbaToLcha(color) {\n const r = a1(color[0]);\n const g = a1(color[1]);\n const b = a1(color[2]);\n const y = a2(r * 0.222488403 + g * 0.716873169 + b * 0.06060791);\n const l = 500 * (a2(r * 0.452247074 + g * 0.399439023 + b * 0.148375274) - y);\n const q = 200 * (y - a2(r * 0.016863605 + g * 0.117638439 + b * 0.865350722));\n const h = Math.atan2(q, l) * (180 / Math.PI);\n return [\n 116 * y - 16,\n Math.sqrt(l * l + q * q),\n h < 0 ? h + 360 : h,\n color[3],\n ];\n}\n\n/**\n * @param {Color} color LCHuv color with alpha.\n * @return {Color} RGBA color.\n */\nexport function lchaToRgba(color) {\n const l = (color[0] + 16) / 116;\n const c = color[1];\n const h = (color[2] * Math.PI) / 180;\n const y = b2(l);\n const x = b2(l + (c / 500) * Math.cos(h));\n const z = b2(l - (c / 200) * Math.sin(h));\n const r = b1(x * 3.021973625 - y * 1.617392459 - z * 0.404875592);\n const g = b1(x * -0.943766287 + y * 1.916279586 + z * 0.027607165);\n const b = b1(x * 0.069407491 - y * 0.22898585 + z * 1.159737864);\n return [\n clamp((r + 0.5) | 0, 0, 255),\n clamp((g + 0.5) | 0, 0, 255),\n clamp((b + 0.5) | 0, 0, 255),\n color[3],\n ];\n}\n\n/**\n * @param {string} s String.\n * @return {Color} Color.\n */\nexport function fromString(s) {\n if (s === 'none') {\n return NO_COLOR;\n }\n if (cache.hasOwnProperty(s)) {\n return cache[s];\n }\n if (cacheSize >= MAX_CACHE_SIZE) {\n let i = 0;\n for (const key in cache) {\n if ((i++ & 3) === 0) {\n delete cache[key];\n --cacheSize;\n }\n }\n }\n\n const color = parseRgba(s);\n if (color.length !== 4) {\n throwInvalidColor(s);\n }\n for (const c of color) {\n if (isNaN(c)) {\n throwInvalidColor(s);\n }\n }\n cache[s] = color;\n ++cacheSize;\n return color;\n}\n\n/**\n * Return the color as an array. This function maintains a cache of calculated\n * arrays which means the result should not be modified.\n * @param {Color|string} color Color.\n * @return {Color} Color.\n * @api\n */\nexport function asArray(color) {\n if (Array.isArray(color)) {\n return color;\n }\n return fromString(color);\n}\n\n/**\n * @param {Color} color Color.\n * @return {string} String.\n */\nexport function toString(color) {\n let r = color[0];\n if (r != (r | 0)) {\n r = (r + 0.5) | 0;\n }\n let g = color[1];\n if (g != (g | 0)) {\n g = (g + 0.5) | 0;\n }\n let b = color[2];\n if (b != (b | 0)) {\n b = (b + 0.5) | 0;\n }\n const a = color[3] === undefined ? 1 : Math.round(color[3] * 1000) / 1000;\n return 'rgba(' + r + ',' + g + ',' + b + ',' + a + ')';\n}\n\n/**\n * @param {string} s String.\n * @return {boolean} Whether the string is actually a valid color\n */\nexport function isStringColor(s) {\n try {\n fromString(s);\n return true;\n } catch {\n return false;\n }\n}\n","/**\n * @module ol/size\n */\n\n/**\n * An array of numbers representing a size: `[width, height]`.\n * @typedef {Array} Size\n * @api\n */\n\n/**\n * Returns a buffered size.\n * @param {Size} size Size.\n * @param {number} num The amount by which to buffer.\n * @param {Size} [dest] Optional reusable size array.\n * @return {Size} The buffered size.\n */\nexport function buffer(size, num, dest) {\n if (dest === undefined) {\n dest = [0, 0];\n }\n dest[0] = size[0] + 2 * num;\n dest[1] = size[1] + 2 * num;\n return dest;\n}\n\n/**\n * Determines if a size has a positive area.\n * @param {Size} size The size to test.\n * @return {boolean} The size has a positive area.\n */\nexport function hasArea(size) {\n return size[0] > 0 && size[1] > 0;\n}\n\n/**\n * Returns a size scaled by a ratio. The result will be an array of integers.\n * @param {Size} size Size.\n * @param {number} ratio Ratio.\n * @param {Size} [dest] Optional reusable size array.\n * @return {Size} The scaled size.\n */\nexport function scale(size, ratio, dest) {\n if (dest === undefined) {\n dest = [0, 0];\n }\n dest[0] = (size[0] * ratio + 0.5) | 0;\n dest[1] = (size[1] * ratio + 0.5) | 0;\n return dest;\n}\n\n/**\n * Returns an `Size` array for the passed in number (meaning: square) or\n * `Size` array.\n * (meaning: non-square),\n * @param {number|Size} size Width and height.\n * @param {Size} [dest] Optional reusable size array.\n * @return {Size} Size.\n * @api\n */\nexport function toSize(size, dest) {\n if (Array.isArray(size)) {\n return size;\n }\n if (dest === undefined) {\n dest = [size, size];\n } else {\n dest[0] = size;\n dest[1] = size;\n }\n return dest;\n}\n","/**\n * @module ol/expr/expression\n */\nimport {ascending} from '../array.js';\nimport {fromString as colorFromString} from '../color.js';\nimport {toSize} from '../size.js';\n\n/**\n * @fileoverview This module includes types and functions for parsing array encoded expressions.\n * The result of parsing an encoded expression is one of the specific expression classes.\n * During parsing, information is added to the parsing context about the data accessed by the\n * expression.\n */\n\n/**\n * Base type used for literal style parameters; can be a number literal or the output of an operator,\n * which in turns takes {@link import(\"./expression.js\").ExpressionValue} arguments.\n *\n * See below for details on the available operators (with notes for those that are WebGL or Canvas only).\n *\n * Reading operators:\n * * `['band', bandIndex, xOffset, yOffset]` For tile layers only. Fetches pixel values from band\n * `bandIndex` of the source's data. The first `bandIndex` of the source data is `1`. Fetched values\n * are in the 0..1 range. {@link import(\"../source/TileImage.js\").default} sources have 4 bands: red,\n * green, blue and alpha. {@link import(\"../source/DataTile.js\").default} sources can have any number\n * of bands, depending on the underlying data source and\n * {@link import(\"../source/GeoTIFF.js\").Options configuration}. `xOffset` and `yOffset` are optional\n * and allow specifying pixel offsets for x and y. This is used for sampling data from neighboring pixels (WebGL only).\n * * `['get', attributeName]` fetches a feature property value, similar to `feature.get('attributeName')`.\n * * `['get', attributeName, keyOrArrayIndex, ...]` (Canvas only) Access nested properties and array items of a\n * feature property. The result is `undefined` when there is nothing at the specified key or index.\n * * `['geometry-type']` returns a feature's geometry type as string, either: 'LineString', 'Point' or 'Polygon'\n * `Multi*` values are returned as their singular equivalent\n * `Circle` geometries are returned as 'Polygon'\n * `GeometryCollection` geometries are returned as the type of the first geometry found in the collection (WebGL only).\n * * `['resolution']` returns the current resolution\n * * `['time']` The time in seconds since the creation of the layer (WebGL only).\n * * `['var', 'varName']` fetches a value from the style variables; will throw an error if that variable is undefined\n * * `['zoom']` The current zoom level (WebGL only).\n * * `['line-metric']` returns the M component of the current point on a line (WebGL only); in case where the geometry layout of the line\n * does not contain an M component (e.g. XY or XYZ), 0 is returned; 0 is also returned for geometries other than lines.\n * Please note that the M component will be linearly interpolated between the two points composing a segment.\n *\n * Math operators:\n * * `['*', value1, value2, ...]` multiplies the values (either numbers or colors)\n * * `['/', value1, value2]` divides `value1` by `value2`\n * * `['+', value1, value2, ...]` adds the values\n * * `['-', value1, value2]` subtracts `value2` from `value1`\n * * `['clamp', value, low, high]` clamps `value` between `low` and `high`\n * * `['%', value1, value2]` returns the result of `value1 % value2` (modulo)\n * * `['^', value1, value2]` returns the value of `value1` raised to the `value2` power\n * * `['abs', value1]` returns the absolute value of `value1`\n * * `['floor', value1]` returns the nearest integer less than or equal to `value1`\n * * `['round', value1]` returns the nearest integer to `value1`\n * * `['ceil', value1]` returns the nearest integer greater than or equal to `value1`\n * * `['sin', value1]` returns the sine of `value1`\n * * `['cos', value1]` returns the cosine of `value1`\n * * `['atan', value1, value2]` returns `atan2(value1, value2)`. If `value2` is not provided, returns `atan(value1)`\n * * `['sqrt', value1]` returns the square root of `value1`\n *\n * * Transform operators:\n * * `['case', condition1, output1, ...conditionN, outputN, fallback]` selects the first output whose corresponding\n * condition evaluates to `true`. If no match is found, returns the `fallback` value.\n * All conditions should be `boolean`, output and fallback can be any kind.\n * * `['match', input, match1, output1, ...matchN, outputN, fallback]` compares the `input` value against all\n * provided `matchX` values, returning the output associated with the first valid match. If no match is found,\n * returns the `fallback` value.\n * `input` and `matchX` values must all be of the same type, and can be `number` or `string`. `outputX` and\n * `fallback` values must be of the same type, and can be of any kind.\n * * `['interpolate', interpolation, input, stop1, output1, ...stopN, outputN]` returns a value by interpolating between\n * pairs of inputs and outputs; `interpolation` can either be `['linear']` or `['exponential', base]` where `base` is\n * the rate of increase from stop A to stop B (i.e. power to which the interpolation ratio is raised); a value\n * of 1 is equivalent to `['linear']`.\n * `input` and `stopX` values must all be of type `number`. `outputX` values can be `number` or `color` values.\n * Note: `input` will be clamped between `stop1` and `stopN`, meaning that all output values will be comprised\n * between `output1` and `outputN`.\n * * `['string', value1, value2, ...]` returns the first value in the list that evaluates to a string.\n * An example would be to provide a default value for get: `['string', ['get', 'propertyname'], 'default value']]`\n * (Canvas only).\n * * `['number', value1, value2, ...]` returns the first value in the list that evaluates to a number.\n * An example would be to provide a default value for get: `['string', ['get', 'propertyname'], 42]]`\n * (Canvas only).\n * * `['coalesce', value1, value2, ...]` returns the first value in the list which is not null or undefined.\n * An example would be to provide a default value for get: `['coalesce', ['get','propertyname'], 'default value']]`\n * (Canvas only).\n *\n * * Logical operators:\n * * `['<', value1, value2]` returns `true` if `value1` is strictly lower than `value2`, or `false` otherwise.\n * * `['<=', value1, value2]` returns `true` if `value1` is lower than or equals `value2`, or `false` otherwise.\n * * `['>', value1, value2]` returns `true` if `value1` is strictly greater than `value2`, or `false` otherwise.\n * * `['>=', value1, value2]` returns `true` if `value1` is greater than or equals `value2`, or `false` otherwise.\n * * `['==', value1, value2]` returns `true` if `value1` equals `value2`, or `false` otherwise.\n * * `['!=', value1, value2]` returns `true` if `value1` does not equal `value2`, or `false` otherwise.\n * * `['!', value1]` returns `false` if `value1` is `true` or greater than `0`, or `true` otherwise.\n * * `['all', value1, value2, ...]` returns `true` if all the inputs are `true`, `false` otherwise.\n * * `['any', value1, value2, ...]` returns `true` if any of the inputs are `true`, `false` otherwise.\n * * `['has', attributeName, keyOrArrayIndex, ...]` returns `true` if feature properties include the (nested) key `attributeName`,\n * `false` otherwise.\n * Note that for WebGL layers, the hardcoded value `-9999999` is used to distinguish when a property is not defined.\n * * `['between', value1, value2, value3]` returns `true` if `value1` is contained between `value2` and `value3`\n * (inclusively), or `false` otherwise.\n * * `['in', needle, haystack]` returns `true` if `needle` is found in `haystack`, and\n * `false` otherwise.\n * This operator has the following limitations:\n * * `haystack` has to be an array of numbers or strings (searching for a substring in a string is not supported yet)\n * * Only literal arrays are supported as `haystack` for now; this means that `haystack` cannot be the result of an\n * expression. If `haystack` is an array of strings, use the `literal` operator to disambiguate from an expression:\n * `['literal', ['abc', 'def', 'ghi']]`\n * This works as well for number arrays although it is not required. Mixing types (numbers and strings) will produce undefined results.\n *\n * * Conversion operators:\n * * `['array', value1, ...valueN]` creates a numerical array from `number` values; please note that the amount of\n * values can currently only be 2, 3 or 4 (WebGL only).\n * * `['color', red, green, blue, alpha]` or `['color', shade, alpha]` creates a `color` value from `number` values;\n * the `alpha` parameter is optional; if not specified, it will be set to 1 (WebGL only).\n * Note: `red`, `green` and `blue` or `shade` components must be values between 0 and 255; `alpha` between 0 and 1.\n * * `['palette', index, colors]` picks a `color` value from an array of colors using the given index; the `index`\n * expression must evaluate to a number; the items in the `colors` array must be strings with hex colors\n * (e.g. `'#86A136'`), colors using the rgba[a] functional notation (e.g. `'rgb(134, 161, 54)'` or `'rgba(134, 161, 54, 1)'`),\n * named colors (e.g. `'red'`), or array literals with 3 ([r, g, b]) or 4 ([r, g, b, a]) values (with r, g, and b\n * in the 0-255 range and a in the 0-1 range) (WebGL only).\n * * `['to-string', value]` converts the input value to a string. If the input is a boolean, the result is \"true\" or \"false\".\n * If the input is a number, it is converted to a string as specified by the \"NumberToString\" algorithm of the ECMAScript\n * Language Specification. If the input is a color, it is converted to a string of the form \"rgba(r,g,b,a)\". (Canvas only)\n *\n * Values can either be literals or another operator, as they will be evaluated recursively.\n * Literal values can be of the following types:\n * * `boolean`\n * * `number`\n * * `number[]` (number arrays can only have a length of 2, 3 or 4)\n * * `string`\n * * {@link module:ol/color~Color}\n *\n * @typedef {Array<*>|import(\"../color.js\").Color|string|number|boolean} ExpressionValue\n * @api\n */\n\n/**\n * @typedef {number} ValueType\n */\n\nlet numTypes = 0;\nexport const NoneType = 0;\nexport const BooleanType = 1 << numTypes++;\nexport const NumberType = 1 << numTypes++;\nexport const StringType = 1 << numTypes++;\nexport const ColorType = 1 << numTypes++;\nexport const NumberArrayType = 1 << numTypes++;\nexport const SizeType = 1 << numTypes++;\nexport const AnyType = Math.pow(2, numTypes) - 1;\n\nconst typeNames = {\n [BooleanType]: 'boolean',\n [NumberType]: 'number',\n [StringType]: 'string',\n [ColorType]: 'color',\n [NumberArrayType]: 'number[]',\n [SizeType]: 'size',\n};\n\nconst namedTypes = Object.keys(typeNames).map(Number).sort(ascending);\n\n/**\n * @param {ValueType} type The type.\n * @return {boolean} The type is one of the specific types (not any or a union type).\n */\nfunction isSpecific(type) {\n return type in typeNames;\n}\n\n/**\n * Get a string representation for a type.\n * @param {ValueType} type The type.\n * @return {string} The type name.\n */\nexport function typeName(type) {\n const names = [];\n for (const namedType of namedTypes) {\n if (includesType(type, namedType)) {\n names.push(typeNames[namedType]);\n }\n }\n if (names.length === 0) {\n return 'untyped';\n }\n if (names.length < 3) {\n return names.join(' or ');\n }\n return names.slice(0, -1).join(', ') + ', or ' + names[names.length - 1];\n}\n\n/**\n * @param {ValueType} broad The broad type.\n * @param {ValueType} specific The specific type.\n * @return {boolean} The broad type includes the specific type.\n */\nexport function includesType(broad, specific) {\n return (broad & specific) === specific;\n}\n\n/**\n * @param {ValueType} oneType One type.\n * @param {ValueType} otherType Another type.\n * @return {boolean} The set of types overlap (share a common specific type)\n */\nexport function overlapsType(oneType, otherType) {\n return !!(oneType & otherType);\n}\n\n/**\n * @param {ValueType} type The type.\n * @param {ValueType} expected The expected type.\n * @return {boolean} The given type is exactly the expected type.\n */\nexport function isType(type, expected) {\n return type === expected;\n}\n\n/**\n * @typedef {boolean|number|string|Array} LiteralValue\n */\n\nexport class LiteralExpression {\n /**\n * @param {ValueType} type The value type.\n * @param {LiteralValue} value The literal value.\n */\n constructor(type, value) {\n if (!isSpecific(type)) {\n throw new Error(\n `literal expressions must have a specific type, got ${typeName(type)}`,\n );\n }\n this.type = type;\n this.value = value;\n }\n}\n\nexport class CallExpression {\n /**\n * @param {ValueType} type The return type.\n * @param {string} operator The operator.\n * @param {...Expression} args The arguments.\n */\n constructor(type, operator, ...args) {\n this.type = type;\n this.operator = operator;\n this.args = args;\n }\n}\n\n/**\n * @typedef {LiteralExpression|CallExpression} Expression\n */\n\n/**\n * @typedef {Object} ParsingContext\n * @property {Map} variables Variables referenced with the 'var' operator; key is name, value is type.\n * @property {Map} properties Properties referenced with the 'get' operator; key is name, value is type.\n * @property {boolean} featureId The style uses the feature id.\n * @property {boolean} geometryType The style uses the feature geometry type.\n * @property {boolean} mCoordinate The style uses the M coordinate of geometries\n * @property {boolean} mapState The style uses the map state (view state or time elapsed).\n * @property {import('../style/flat.js').StyleVariables} [inputVariables] Variable values (i.e. style variables) given as input during parsing to help with type narrowing\n */\n\n/**\n * @param {import('../style/flat.js').StyleVariables} [inputVariables] Variable values (i.e. style variables) given as input during parsing to help with type narrowing\n * @return {ParsingContext} A new parsing context.\n */\nexport function newParsingContext(inputVariables) {\n return {\n variables: new Map(),\n properties: new Map(),\n featureId: false,\n geometryType: false,\n mCoordinate: false,\n mapState: false,\n inputVariables,\n };\n}\n\n/**\n * @typedef {LiteralValue|Array} EncodedExpression\n */\n\n/**\n * @param {EncodedExpression} encoded The encoded expression.\n * @param {ValueType} expectedType The expected type.\n * @param {ParsingContext} context The parsing context.\n * @return {Expression} The parsed expression result.\n */\nexport function parse(encoded, expectedType, context) {\n switch (typeof encoded) {\n case 'boolean': {\n if (isType(expectedType, StringType)) {\n return new LiteralExpression(StringType, encoded ? 'true' : 'false');\n }\n if (!includesType(expectedType, BooleanType)) {\n throw new Error(\n `got a boolean, but expected ${typeName(expectedType)}`,\n );\n }\n return new LiteralExpression(BooleanType, encoded);\n }\n case 'number': {\n if (isType(expectedType, SizeType)) {\n return new LiteralExpression(SizeType, toSize(encoded));\n }\n if (isType(expectedType, BooleanType)) {\n return new LiteralExpression(BooleanType, !!encoded);\n }\n if (isType(expectedType, StringType)) {\n return new LiteralExpression(StringType, encoded.toString());\n }\n if (!includesType(expectedType, NumberType)) {\n throw new Error(`got a number, but expected ${typeName(expectedType)}`);\n }\n return new LiteralExpression(NumberType, encoded);\n }\n case 'string': {\n if (isType(expectedType, ColorType)) {\n return new LiteralExpression(ColorType, colorFromString(encoded));\n }\n if (isType(expectedType, BooleanType)) {\n return new LiteralExpression(BooleanType, !!encoded);\n }\n if (!includesType(expectedType, StringType)) {\n throw new Error(`got a string, but expected ${typeName(expectedType)}`);\n }\n return new LiteralExpression(StringType, encoded);\n }\n default: {\n // pass\n }\n }\n\n if (!Array.isArray(encoded)) {\n throw new Error('expression must be an array or a primitive value');\n }\n\n if (encoded.length === 0) {\n throw new Error('empty expression');\n }\n\n if (typeof encoded[0] === 'string') {\n return parseCallExpression(encoded, expectedType, context);\n }\n\n for (const item of encoded) {\n if (typeof item !== 'number') {\n throw new Error('expected an array of numbers');\n }\n }\n\n if (isType(expectedType, SizeType)) {\n if (encoded.length !== 2) {\n throw new Error(\n `expected an array of two values for a size, got ${encoded.length}`,\n );\n }\n return new LiteralExpression(SizeType, encoded);\n }\n\n if (isType(expectedType, ColorType)) {\n if (encoded.length === 3) {\n return new LiteralExpression(ColorType, [...encoded, 1]);\n }\n if (encoded.length === 4) {\n return new LiteralExpression(ColorType, encoded);\n }\n throw new Error(\n `expected an array of 3 or 4 values for a color, got ${encoded.length}`,\n );\n }\n\n if (!includesType(expectedType, NumberArrayType)) {\n throw new Error(\n `got an array of numbers, but expected ${typeName(expectedType)}`,\n );\n }\n\n return new LiteralExpression(NumberArrayType, encoded);\n}\n\n/**\n * @type {Object}\n */\nexport const Ops = {\n Get: 'get',\n Var: 'var',\n Concat: 'concat',\n GeometryType: 'geometry-type',\n LineMetric: 'line-metric',\n Any: 'any',\n All: 'all',\n Not: '!',\n Resolution: 'resolution',\n Zoom: 'zoom',\n Time: 'time',\n Equal: '==',\n NotEqual: '!=',\n GreaterThan: '>',\n GreaterThanOrEqualTo: '>=',\n LessThan: '<',\n LessThanOrEqualTo: '<=',\n Multiply: '*',\n Divide: '/',\n Add: '+',\n Subtract: '-',\n Clamp: 'clamp',\n Mod: '%',\n Pow: '^',\n Abs: 'abs',\n Floor: 'floor',\n Ceil: 'ceil',\n Round: 'round',\n Sin: 'sin',\n Cos: 'cos',\n Atan: 'atan',\n Sqrt: 'sqrt',\n Match: 'match',\n Between: 'between',\n Interpolate: 'interpolate',\n Coalesce: 'coalesce',\n Case: 'case',\n In: 'in',\n Number: 'number',\n String: 'string',\n Array: 'array',\n Color: 'color',\n Id: 'id',\n Band: 'band',\n Palette: 'palette',\n ToString: 'to-string',\n Has: 'has',\n};\n\n/**\n * @typedef {function(Array, number, ParsingContext):Expression} Parser\n *\n * Second argument is the expected type.\n */\n\n/**\n * @type {Object}\n */\nconst parsers = {\n [Ops.Get]: createCallExpressionParser(hasArgsCount(1, Infinity), withGetArgs),\n [Ops.Var]: createVarExpressionParser(),\n [Ops.Has]: createCallExpressionParser(hasArgsCount(1, Infinity), withGetArgs),\n [Ops.Id]: createCallExpressionParser(usesFeatureId, withNoArgs),\n [Ops.Concat]: createCallExpressionParser(\n hasArgsCount(2, Infinity),\n withArgsOfType(StringType),\n ),\n [Ops.GeometryType]: createCallExpressionParser(usesGeometryType, withNoArgs),\n [Ops.LineMetric]: createCallExpressionParser(usesMCoordinate, withNoArgs),\n [Ops.Resolution]: createCallExpressionParser(usesMapState, withNoArgs),\n [Ops.Zoom]: createCallExpressionParser(usesMapState, withNoArgs),\n [Ops.Time]: createCallExpressionParser(usesMapState, withNoArgs),\n [Ops.Any]: createCallExpressionParser(\n hasArgsCount(2, Infinity),\n withArgsOfType(BooleanType),\n ),\n [Ops.All]: createCallExpressionParser(\n hasArgsCount(2, Infinity),\n withArgsOfType(BooleanType),\n ),\n [Ops.Not]: createCallExpressionParser(\n hasArgsCount(1, 1),\n withArgsOfType(BooleanType),\n ),\n [Ops.Equal]: createCallExpressionParser(\n hasArgsCount(2, 2),\n withArgsOfIdenticalType(),\n ),\n [Ops.NotEqual]: createCallExpressionParser(\n hasArgsCount(2, 2),\n withArgsOfIdenticalType(),\n ),\n [Ops.GreaterThan]: createCallExpressionParser(\n hasArgsCount(2, 2),\n withArgsOfType(NumberType),\n ),\n [Ops.GreaterThanOrEqualTo]: createCallExpressionParser(\n hasArgsCount(2, 2),\n withArgsOfType(NumberType),\n ),\n [Ops.LessThan]: createCallExpressionParser(\n hasArgsCount(2, 2),\n withArgsOfType(NumberType),\n ),\n [Ops.LessThanOrEqualTo]: createCallExpressionParser(\n hasArgsCount(2, 2),\n withArgsOfType(NumberType),\n ),\n [Ops.Multiply]: createCallExpressionParser(\n hasArgsCount(2, Infinity),\n withArgsOfReturnType,\n ),\n [Ops.Coalesce]: createCallExpressionParser(\n hasArgsCount(2, Infinity),\n withArgsOfReturnType,\n ),\n [Ops.Divide]: createCallExpressionParser(\n hasArgsCount(2, 2),\n withArgsOfType(NumberType),\n ),\n [Ops.Add]: createCallExpressionParser(\n hasArgsCount(2, Infinity),\n withArgsOfType(NumberType),\n ),\n [Ops.Subtract]: createCallExpressionParser(\n hasArgsCount(2, 2),\n withArgsOfType(NumberType),\n ),\n [Ops.Clamp]: createCallExpressionParser(\n hasArgsCount(3, 3),\n withArgsOfType(NumberType),\n ),\n [Ops.Mod]: createCallExpressionParser(\n hasArgsCount(2, 2),\n withArgsOfType(NumberType),\n ),\n [Ops.Pow]: createCallExpressionParser(\n hasArgsCount(2, 2),\n withArgsOfType(NumberType),\n ),\n [Ops.Abs]: createCallExpressionParser(\n hasArgsCount(1, 1),\n withArgsOfType(NumberType),\n ),\n [Ops.Floor]: createCallExpressionParser(\n hasArgsCount(1, 1),\n withArgsOfType(NumberType),\n ),\n [Ops.Ceil]: createCallExpressionParser(\n hasArgsCount(1, 1),\n withArgsOfType(NumberType),\n ),\n [Ops.Round]: createCallExpressionParser(\n hasArgsCount(1, 1),\n withArgsOfType(NumberType),\n ),\n [Ops.Sin]: createCallExpressionParser(\n hasArgsCount(1, 1),\n withArgsOfType(NumberType),\n ),\n [Ops.Cos]: createCallExpressionParser(\n hasArgsCount(1, 1),\n withArgsOfType(NumberType),\n ),\n [Ops.Atan]: createCallExpressionParser(\n hasArgsCount(1, 2),\n withArgsOfType(NumberType),\n ),\n [Ops.Sqrt]: createCallExpressionParser(\n hasArgsCount(1, 1),\n withArgsOfType(NumberType),\n ),\n [Ops.Match]: createCallExpressionParser(\n hasArgsCount(4, Infinity),\n hasEvenArgs,\n withMatchArgs,\n ),\n [Ops.Between]: createCallExpressionParser(\n hasArgsCount(3, 3),\n withArgsOfType(NumberType),\n ),\n [Ops.Interpolate]: createCallExpressionParser(\n hasArgsCount(6, Infinity),\n hasEvenArgs,\n withInterpolateArgs,\n ),\n [Ops.Case]: createCallExpressionParser(\n hasArgsCount(3, Infinity),\n hasOddArgs,\n withCaseArgs,\n ),\n [Ops.In]: createCallExpressionParser(hasArgsCount(2, 2), withInArgs),\n [Ops.Number]: createCallExpressionParser(\n hasArgsCount(1, Infinity),\n withArgsOfType(AnyType),\n ),\n [Ops.String]: createCallExpressionParser(\n hasArgsCount(1, Infinity),\n withArgsOfType(AnyType),\n ),\n [Ops.Array]: createCallExpressionParser(\n hasArgsCount(1, Infinity),\n withArgsOfType(NumberType),\n ),\n [Ops.Color]: createCallExpressionParser(\n hasArgsCount(1, 4),\n withArgsOfType(NumberType),\n ),\n [Ops.Band]: createCallExpressionParser(\n hasArgsCount(1, 3),\n withArgsOfType(NumberType),\n ),\n [Ops.Palette]: createCallExpressionParser(\n hasArgsCount(2, 2),\n withPaletteArgs,\n ),\n [Ops.ToString]: createCallExpressionParser(\n hasArgsCount(1, 1),\n withArgsOfType(BooleanType | NumberType | StringType | ColorType),\n ),\n};\n\n/**\n * @typedef {function(Array, ValueType, ParsingContext):Array|void} ArgValidator\n *\n * An argument validator applies various checks to an encoded expression arguments and\n * returns the parsed arguments if any. The second argument is the return type of the call expression.\n */\n\n/**\n * @type {ArgValidator}\n */\nfunction withGetArgs(encoded, returnType, context) {\n const argsCount = encoded.length - 1;\n const args = new Array(argsCount);\n for (let i = 0; i < argsCount; ++i) {\n const key = encoded[i + 1];\n switch (typeof key) {\n case 'number': {\n args[i] = new LiteralExpression(NumberType, key);\n break;\n }\n case 'string': {\n args[i] = new LiteralExpression(StringType, key);\n break;\n }\n default: {\n throw new Error(\n `expected a string key or numeric array index for a get operation, got ${key}`,\n );\n }\n }\n if (i === 0) {\n context.properties.set(String(key), returnType);\n }\n }\n return args;\n}\n\n/**\n * This special expression parser reads style variables present in the context to narrow down\n * the expected return type of the 'var' operator\n * @return {Parser} The parser.\n */\nfunction createVarExpressionParser() {\n return function (encoded, returnType, context) {\n const name = encoded[1];\n if (typeof name !== 'string') {\n throw new Error('expected a string argument for var operation');\n }\n let type = returnType;\n\n const variableValue = context.inputVariables?.[name];\n if (variableValue !== undefined) {\n const parsedInput = parse(variableValue, AnyType, context);\n if (!(parsedInput instanceof LiteralExpression)) {\n throw new Error(\n `style variables should only be literal values (no expressions!), variable name: ${name}`,\n );\n }\n let parsedType = parsedInput.type;\n\n // special cases (because variables are not embedded in expressions and as such are harder to figure out their types)\n // * if the variable is a string (e.g. 'blue') and we know that the expected type is not\n // StringType but ColorType, assume that the variable is indeed a color and not a string\n // * if the variable is 2-elements a number array and we know that the expected type is SizeType\n // and not NumberArrayType, assume that the variable is indeed a size\n if (\n typeof variableValue === 'string' &&\n overlapsType(type, ColorType) &&\n !overlapsType(type, StringType)\n ) {\n parsedType = ColorType;\n } else if (\n Array.isArray(variableValue) &&\n variableValue.length === 2 &&\n overlapsType(type, SizeType) &&\n !overlapsType(type, NumberArrayType)\n ) {\n parsedType = SizeType;\n }\n\n type &= parsedType;\n if (type === NoneType) {\n throw new Error(\n `the type expected from the var operator (${typeName(returnType)}) did not have any overlap with the type of the corresponding style variables (${typeName(parsedType)}), variable name: ${name}`,\n );\n }\n }\n\n if (context.variables.has(name)) {\n const existingType = context.variables.get(name);\n type &= existingType;\n if (type === NoneType) {\n throw new Error(\n `a new type expected from the var operator (${typeName(returnType)}) did not have any overlap with the previous type expected for it (${typeName(existingType)}), variable name: ${name}`,\n );\n }\n }\n\n context.variables.set(name, type);\n\n return new CallExpression(\n type,\n 'var',\n new LiteralExpression(StringType, name),\n );\n };\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction usesFeatureId(encoded, returnType, context) {\n context.featureId = true;\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction usesGeometryType(encoded, returnType, context) {\n context.geometryType = true;\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction usesMCoordinate(encoded, returnType, context) {\n context.mCoordinate = true;\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction usesMapState(encoded, returnType, context) {\n context.mapState = true;\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction withNoArgs(encoded, returnType, context) {\n const operation = encoded[0];\n if (encoded.length !== 1) {\n throw new Error(`expected no arguments for ${operation} operation`);\n }\n return [];\n}\n\n/**\n * @param {number} minArgs The minimum number of arguments.\n * @param {number} maxArgs The maximum number of arguments.\n * @return {ArgValidator} The argument validator\n */\nfunction hasArgsCount(minArgs, maxArgs) {\n return function (encoded, returnType, context) {\n const operation = encoded[0];\n const argCount = encoded.length - 1;\n if (minArgs === maxArgs) {\n if (argCount !== minArgs) {\n const plural = minArgs === 1 ? '' : 's';\n throw new Error(\n `expected ${minArgs} argument${plural} for ${operation}, got ${argCount}`,\n );\n }\n } else if (argCount < minArgs || argCount > maxArgs) {\n const range =\n maxArgs === Infinity\n ? `${minArgs} or more`\n : `${minArgs} to ${maxArgs}`;\n throw new Error(\n `expected ${range} arguments for ${operation}, got ${argCount}`,\n );\n }\n };\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction withArgsOfReturnType(encoded, returnType, context) {\n const argCount = encoded.length - 1;\n /**\n * @type {Array}\n */\n const args = new Array(argCount);\n for (let i = 0; i < argCount; ++i) {\n const expression = parse(encoded[i + 1], returnType, context);\n args[i] = expression;\n }\n return args;\n}\n\n/**\n * @param {ValueType} argType The argument type.\n * @return {ArgValidator} The argument validator\n */\nfunction withArgsOfType(argType) {\n return function (encoded, returnType, context) {\n const argCount = encoded.length - 1;\n /**\n * @type {Array}\n */\n const args = new Array(argCount);\n for (let i = 0; i < argCount; ++i) {\n const expression = parse(encoded[i + 1], argType, context);\n args[i] = expression;\n }\n return args;\n };\n}\n\n/**\n * @return {ArgValidator} The argument validator\n */\nfunction withArgsOfIdenticalType() {\n return function (encoded, returnType, context) {\n const operation = encoded[0];\n const argCount = encoded.length - 1;\n /**\n * @type {Array}\n */\n const args = new Array(argCount);\n let commonType = AnyType;\n for (let i = 0; i < argCount; ++i) {\n const expression = parse(encoded[i + 1], commonType, context);\n commonType &= expression.type;\n }\n if (commonType === NoneType) {\n throw new Error(\n `no common type was found among the arguments of ${operation}`,\n );\n }\n // second loop to compile actual args\n for (let i = 0; i < argCount; ++i) {\n const expression = parse(encoded[i + 1], commonType, context);\n args[i] = expression;\n }\n return args;\n };\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction hasOddArgs(encoded, returnType, context) {\n const operation = encoded[0];\n const argCount = encoded.length - 1;\n if (argCount % 2 === 0) {\n throw new Error(\n `expected an odd number of arguments for ${operation}, got ${argCount} instead`,\n );\n }\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction hasEvenArgs(encoded, returnType, context) {\n const operation = encoded[0];\n const argCount = encoded.length - 1;\n if (argCount % 2 === 1) {\n throw new Error(\n `expected an even number of arguments for operation ${operation}, got ${argCount} instead`,\n );\n }\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction withMatchArgs(encoded, returnType, context) {\n const argsCount = encoded.length - 1;\n\n const fallback = parse(encoded[encoded.length - 1], returnType, context);\n\n let inputType = StringType | NumberType | BooleanType;\n const args = new Array(argsCount - 2);\n\n // first round to determine input type\n for (let i = 0; i < argsCount - 2; i += 2) {\n try {\n const match = parse(encoded[i + 2], inputType, context);\n inputType &= match.type;\n } catch (err) {\n throw new Error(\n `failed to parse argument ${i + 1} of match expression: ${err.message}`,\n );\n }\n if (inputType === NoneType) {\n throw new Error(\n `no common type was found among the arguments of match expression`,\n );\n }\n }\n\n for (let i = 0; i < argsCount - 2; i += 2) {\n try {\n const match = parse(encoded[i + 2], inputType, context);\n args[i] = match;\n } catch (err) {\n throw new Error(\n `failed to parse argument ${i + 1} of match expression: ${err.message}`,\n );\n }\n try {\n const output = parse(encoded[i + 3], fallback.type, context);\n args[i + 1] = output;\n } catch (err) {\n throw new Error(\n `failed to parse argument ${i + 2} of match expression: ${err.message}`,\n );\n }\n }\n\n const input = parse(encoded[1], inputType, context);\n\n return [input, ...args, fallback];\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction withInterpolateArgs(encoded, returnType, context) {\n const interpolationType = encoded[1];\n /**\n * @type {number}\n */\n let base;\n switch (interpolationType[0]) {\n case 'linear':\n base = 1;\n break;\n case 'exponential':\n const b = interpolationType[1];\n if (typeof b !== 'number' || b <= 0) {\n throw new Error(\n `expected a number base for exponential interpolation` +\n `, got ${JSON.stringify(b)} instead`,\n );\n }\n base = b;\n break;\n default:\n throw new Error(\n `invalid interpolation type: ${JSON.stringify(interpolationType)}`,\n );\n }\n\n const interpolation = new LiteralExpression(NumberType, base);\n\n let input;\n try {\n input = parse(encoded[2], NumberType, context);\n } catch (err) {\n throw new Error(\n `failed to parse argument 1 in interpolate expression: ${err.message}`,\n );\n }\n\n const args = new Array(encoded.length - 3);\n for (let i = 0; i < args.length; i += 2) {\n try {\n const stop = parse(encoded[i + 3], NumberType, context);\n args[i] = stop;\n } catch (err) {\n throw new Error(\n `failed to parse argument ${i + 2} for interpolate expression: ${err.message}`,\n );\n }\n try {\n const output = parse(encoded[i + 4], returnType, context);\n args[i + 1] = output;\n } catch (err) {\n throw new Error(\n `failed to parse argument ${i + 3} for interpolate expression: ${err.message}`,\n );\n }\n }\n\n return [interpolation, input, ...args];\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction withCaseArgs(encoded, returnType, context) {\n const fallback = parse(encoded[encoded.length - 1], returnType, context);\n\n const args = new Array(encoded.length - 1);\n for (let i = 0; i < args.length - 1; i += 2) {\n try {\n const condition = parse(encoded[i + 1], BooleanType, context);\n args[i] = condition;\n } catch (err) {\n throw new Error(\n `failed to parse argument ${i} of case expression: ${err.message}`,\n );\n }\n try {\n const output = parse(encoded[i + 2], fallback.type, context);\n args[i + 1] = output;\n } catch (err) {\n throw new Error(\n `failed to parse argument ${i + 1} of case expression: ${err.message}`,\n );\n }\n }\n\n args[args.length - 1] = fallback;\n return args;\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction withInArgs(encoded, returnType, context) {\n let haystack = encoded[2];\n if (!Array.isArray(haystack)) {\n throw new Error(\n `the second argument for the \"in\" operator must be an array`,\n );\n }\n /**\n * @type {ValueType}\n */\n let needleType;\n\n // check if we're using the 'literal' operator for the haystack\n if (haystack[0] === 'literal') {\n haystack = haystack[1];\n if (!Array.isArray(haystack)) {\n throw new Error(\n `failed to parse \"in\" expression: the literal operator must be followed by an array`,\n );\n }\n } else if (typeof haystack[0] === 'string') {\n throw new Error(\n `for the \"in\" operator, a string array should be wrapped in a \"literal\" operator to disambiguate from expressions`,\n );\n }\n\n if (typeof haystack[0] === 'string') {\n needleType = StringType;\n } else {\n needleType = NumberType;\n }\n\n const args = new Array(haystack.length);\n for (let i = 0; i < args.length; i++) {\n try {\n const arg = parse(haystack[i], needleType, context);\n args[i] = arg;\n } catch (err) {\n throw new Error(\n `failed to parse haystack item ${i} for \"in\" expression: ${err.message}`,\n );\n }\n }\n\n const needle = parse(encoded[1], needleType, context);\n return [needle, ...args];\n}\n\n/**\n * @type {ArgValidator}\n */\nfunction withPaletteArgs(encoded, returnType, context) {\n let index;\n try {\n index = parse(encoded[1], NumberType, context);\n } catch (err) {\n throw new Error(\n `failed to parse first argument in palette expression: ${err.message}`,\n );\n }\n const colors = encoded[2];\n if (!Array.isArray(colors)) {\n throw new Error('the second argument of palette must be an array');\n }\n const parsedColors = new Array(colors.length);\n for (let i = 0; i < parsedColors.length; i++) {\n let color;\n try {\n color = parse(colors[i], ColorType, context);\n } catch (err) {\n throw new Error(\n `failed to parse color at index ${i} in palette expression: ${err.message}`,\n );\n }\n if (!(color instanceof LiteralExpression)) {\n throw new Error(\n `the palette color at index ${i} must be a literal value`,\n );\n }\n parsedColors[i] = color;\n }\n return [index, ...parsedColors];\n}\n\n/**\n * @param {Array} validators A chain of argument validators. The last validator is expected\n * to return the parsed arguments.\n * @return {Parser} The parser.\n */\nfunction createCallExpressionParser(...validators) {\n return function (encoded, returnType, context) {\n const operator = encoded[0];\n\n /**\n * @type {Array}\n */\n let args;\n for (let i = 0; i < validators.length; i++) {\n const parsed = validators[i](encoded, returnType, context);\n if (i == validators.length - 1) {\n if (!parsed) {\n throw new Error(\n 'expected last argument validator to return the parsed args',\n );\n }\n args = parsed;\n }\n }\n return new CallExpression(returnType, operator, ...args);\n };\n}\n\n/**\n * @param {Array} encoded The encoded expression.\n * @param {ValueType} returnType The expected return type of the call expression.\n * @param {ParsingContext} context The parsing context.\n * @return {Expression} The parsed expression.\n */\nfunction parseCallExpression(encoded, returnType, context) {\n const operator = encoded[0];\n\n const parser = parsers[operator];\n if (!parser) {\n throw new Error(`unknown operator: ${operator}`);\n }\n return parser(encoded, returnType, context);\n}\n\n/**\n * Returns a simplified geometry type suited for the `geometry-type` operator\n * @param {import('../geom/Geometry.js').default|import('../render/Feature.js').default} geometry Geometry object\n * @return {'Point'|'LineString'|'Polygon'|''} Simplified geometry type; empty string of no geometry found\n */\nexport function computeGeometryType(geometry) {\n if (!geometry) {\n return '';\n }\n const type = geometry.getType();\n switch (type) {\n case 'Point':\n case 'LineString':\n case 'Polygon':\n return type;\n case 'MultiPoint':\n case 'MultiLineString':\n case 'MultiPolygon':\n return /** @type {'Point'|'LineString'|'Polygon'} */ (type.substring(5));\n case 'Circle':\n return 'Polygon';\n case 'GeometryCollection':\n return computeGeometryType(\n /** @type {import(\"../geom/GeometryCollection.js\").default} */ (\n geometry\n ).getGeometries()[0],\n );\n default:\n return '';\n }\n}\n","/**\n * @module ol/expr/cpu\n */\n\nimport {\n fromString,\n lchaToRgba,\n rgbaToLcha,\n toString,\n withAlpha,\n} from '../color.js';\nimport {ColorType, LiteralExpression, Ops, parse} from './expression.js';\n\n/**\n * @typedef {import('./expression.js').ValueType} ValueType\n */\n\n/**\n * @fileoverview This module includes functions to build expressions for evaluation on the CPU.\n * Building is composed of two steps: parsing and compiling. The parsing step takes an encoded\n * expression and returns an instance of one of the expression classes. The compiling step takes\n * the expression instance and returns a function that can be evaluated in to return a literal\n * value. The evaluator function should do as little allocation and work as possible.\n */\n\n/**\n * @typedef {Object} EvaluationContext\n * @property {Object} properties The values for properties used in 'get' expressions.\n * @property {Object} variables The values for variables used in 'var' expressions.\n * @property {number} resolution The map resolution.\n * @property {string|number|null} featureId The feature id.\n * @property {string} geometryType Geometry type of the current object.\n */\n\n/**\n * @return {EvaluationContext} A new evaluation context.\n */\nexport function newEvaluationContext() {\n return {\n variables: {},\n properties: {},\n resolution: NaN,\n featureId: null,\n geometryType: '',\n };\n}\n\n/**\n * @typedef {function(EvaluationContext):import(\"./expression.js\").LiteralValue} ExpressionEvaluator\n */\n\n/**\n * @typedef {function(EvaluationContext):boolean} BooleanEvaluator\n */\n\n/**\n * @typedef {function(EvaluationContext):number} NumberEvaluator\n */\n\n/**\n * @typedef {function(EvaluationContext):string} StringEvaluator\n */\n\n/**\n * @typedef {function(EvaluationContext):(Array|string)} ColorLikeEvaluator\n */\n\n/**\n * @typedef {function(EvaluationContext):Array} NumberArrayEvaluator\n */\n\n/**\n * @typedef {function(EvaluationContext):Array} CoordinateEvaluator\n */\n\n/**\n * @typedef {function(EvaluationContext):(Array)} SizeEvaluator\n */\n\n/**\n * @typedef {function(EvaluationContext):(Array|number)} SizeLikeEvaluator\n */\n\n/**\n * @param {import('./expression.js').EncodedExpression} encoded The encoded expression.\n * @param {ValueType} type The expected type.\n * @param {import('./expression.js').ParsingContext} context The parsing context.\n * @return {ExpressionEvaluator} The expression evaluator.\n */\nexport function buildExpression(encoded, type, context) {\n const expression = parse(encoded, type, context);\n return compileExpression(expression, context);\n}\n\n/**\n * @param {import(\"./expression.js\").Expression} expression The expression.\n * @param {import('./expression.js').ParsingContext} context The parsing context.\n * @return {ExpressionEvaluator} The evaluator function.\n */\nfunction compileExpression(expression, context) {\n if (expression instanceof LiteralExpression) {\n // convert colors to array if possible\n if (expression.type === ColorType && typeof expression.value === 'string') {\n const colorValue = fromString(expression.value);\n return function () {\n return colorValue;\n };\n }\n return function () {\n return expression.value;\n };\n }\n const operator = expression.operator;\n switch (operator) {\n case Ops.Number:\n case Ops.String:\n case Ops.Coalesce: {\n return compileAssertionExpression(expression, context);\n }\n case Ops.Get:\n case Ops.Var:\n case Ops.Has: {\n return compileAccessorExpression(expression, context);\n }\n case Ops.Id: {\n return (context) => context.featureId;\n }\n case Ops.GeometryType: {\n return (context) => context.geometryType;\n }\n case Ops.Concat: {\n const args = expression.args.map((e) => compileExpression(e, context));\n return (context) =>\n ''.concat(...args.map((arg) => arg(context).toString()));\n }\n case Ops.Resolution: {\n return (context) => context.resolution;\n }\n case Ops.Any:\n case Ops.All:\n case Ops.Between:\n case Ops.In:\n case Ops.Not: {\n return compileLogicalExpression(expression, context);\n }\n case Ops.Equal:\n case Ops.NotEqual:\n case Ops.LessThan:\n case Ops.LessThanOrEqualTo:\n case Ops.GreaterThan:\n case Ops.GreaterThanOrEqualTo: {\n return compileComparisonExpression(expression, context);\n }\n case Ops.Multiply:\n case Ops.Divide:\n case Ops.Add:\n case Ops.Subtract:\n case Ops.Clamp:\n case Ops.Mod:\n case Ops.Pow:\n case Ops.Abs:\n case Ops.Floor:\n case Ops.Ceil:\n case Ops.Round:\n case Ops.Sin:\n case Ops.Cos:\n case Ops.Atan:\n case Ops.Sqrt: {\n return compileNumericExpression(expression, context);\n }\n case Ops.Case: {\n return compileCaseExpression(expression, context);\n }\n case Ops.Match: {\n return compileMatchExpression(expression, context);\n }\n case Ops.Interpolate: {\n return compileInterpolateExpression(expression, context);\n }\n case Ops.ToString: {\n return compileConvertExpression(expression, context);\n }\n default: {\n throw new Error(`Unsupported operator ${operator}`);\n }\n // TODO: unimplemented\n // Ops.Zoom\n // Ops.Time\n // Ops.Array\n // Ops.Color\n // Ops.Band\n // Ops.Palette\n }\n}\n\n/**\n * @param {import('./expression.js').CallExpression} expression The call expression.\n * @param {import('./expression.js').ParsingContext} context The parsing context.\n * @return {ExpressionEvaluator} The evaluator function.\n */\nfunction compileAssertionExpression(expression, context) {\n const type = expression.operator;\n const length = expression.args.length;\n\n const args = new Array(length);\n for (let i = 0; i < length; ++i) {\n args[i] = compileExpression(expression.args[i], context);\n }\n switch (type) {\n case Ops.Coalesce: {\n return (context) => {\n for (let i = 0; i < length; ++i) {\n const value = args[i](context);\n if (typeof value !== 'undefined' && value !== null) {\n return value;\n }\n }\n throw new Error('Expected one of the values to be non-null');\n };\n }\n case Ops.Number:\n case Ops.String: {\n return (context) => {\n for (let i = 0; i < length; ++i) {\n const value = args[i](context);\n if (typeof value === type) {\n return value;\n }\n }\n throw new Error(`Expected one of the values to be a ${type}`);\n };\n }\n default: {\n throw new Error(`Unsupported assertion operator ${type}`);\n }\n }\n}\n\n/**\n * @param {import('./expression.js').CallExpression} expression The call expression.\n * @param {import('./expression.js').ParsingContext} context The parsing context.\n * @return {ExpressionEvaluator} The evaluator function.\n */\nfunction compileAccessorExpression(expression, context) {\n const nameExpression = /** @type {LiteralExpression} */ (expression.args[0]);\n const name = /** @type {string} */ (nameExpression.value);\n switch (expression.operator) {\n case Ops.Get: {\n return (context) => {\n const args = expression.args;\n let value = context.properties[name];\n for (let i = 1, ii = args.length; i < ii; ++i) {\n const keyExpression = /** @type {LiteralExpression} */ (args[i]);\n const key = /** @type {string|number} */ (keyExpression.value);\n value = value[key];\n }\n return value;\n };\n }\n case Ops.Var: {\n return (context) => context.variables[name];\n }\n case Ops.Has: {\n return (context) => {\n const args = expression.args;\n if (!(name in context.properties)) {\n return false;\n }\n let value = context.properties[name];\n for (let i = 1, ii = args.length; i < ii; ++i) {\n const keyExpression = /** @type {LiteralExpression} */ (args[i]);\n const key = /** @type {string|number} */ (keyExpression.value);\n if (!value || !Object.hasOwn(value, key)) {\n return false;\n }\n value = value[key];\n }\n return true;\n };\n }\n default: {\n throw new Error(`Unsupported accessor operator ${expression.operator}`);\n }\n }\n}\n\n/**\n * @param {import('./expression.js').CallExpression} expression The call expression.\n * @param {import('./expression.js').ParsingContext} context The parsing context.\n * @return {BooleanEvaluator} The evaluator function.\n */\nfunction compileComparisonExpression(expression, context) {\n const op = expression.operator;\n const left = compileExpression(expression.args[0], context);\n const right = compileExpression(expression.args[1], context);\n switch (op) {\n case Ops.Equal: {\n return (context) => left(context) === right(context);\n }\n case Ops.NotEqual: {\n return (context) => left(context) !== right(context);\n }\n case Ops.LessThan: {\n return (context) => left(context) < right(context);\n }\n case Ops.LessThanOrEqualTo: {\n return (context) => left(context) <= right(context);\n }\n case Ops.GreaterThan: {\n return (context) => left(context) > right(context);\n }\n case Ops.GreaterThanOrEqualTo: {\n return (context) => left(context) >= right(context);\n }\n default: {\n throw new Error(`Unsupported comparison operator ${op}`);\n }\n }\n}\n\n/**\n * @param {import('./expression.js').CallExpression} expression The call expression.\n * @param {import('./expression.js').ParsingContext} context The parsing context.\n * @return {BooleanEvaluator} The evaluator function.\n */\nfunction compileLogicalExpression(expression, context) {\n const op = expression.operator;\n const length = expression.args.length;\n\n const args = new Array(length);\n for (let i = 0; i < length; ++i) {\n args[i] = compileExpression(expression.args[i], context);\n }\n switch (op) {\n case Ops.Any: {\n return (context) => {\n for (let i = 0; i < length; ++i) {\n if (args[i](context)) {\n return true;\n }\n }\n return false;\n };\n }\n case Ops.All: {\n return (context) => {\n for (let i = 0; i < length; ++i) {\n if (!args[i](context)) {\n return false;\n }\n }\n return true;\n };\n }\n case Ops.Between: {\n return (context) => {\n const value = args[0](context);\n const min = args[1](context);\n const max = args[2](context);\n return value >= min && value <= max;\n };\n }\n case Ops.In: {\n return (context) => {\n const value = args[0](context);\n for (let i = 1; i < length; ++i) {\n if (value === args[i](context)) {\n return true;\n }\n }\n return false;\n };\n }\n case Ops.Not: {\n return (context) => !args[0](context);\n }\n default: {\n throw new Error(`Unsupported logical operator ${op}`);\n }\n }\n}\n\n/**\n * @param {import('./expression.js').CallExpression} expression The call expression.\n * @param {import('./expression.js').ParsingContext} context The parsing context.\n * @return {NumberEvaluator} The evaluator function.\n */\nfunction compileNumericExpression(expression, context) {\n const op = expression.operator;\n const length = expression.args.length;\n\n const args = new Array(length);\n for (let i = 0; i < length; ++i) {\n args[i] = compileExpression(expression.args[i], context);\n }\n switch (op) {\n case Ops.Multiply: {\n return (context) => {\n let value = 1;\n for (let i = 0; i < length; ++i) {\n value *= args[i](context);\n }\n return value;\n };\n }\n case Ops.Divide: {\n return (context) => args[0](context) / args[1](context);\n }\n case Ops.Add: {\n return (context) => {\n let value = 0;\n for (let i = 0; i < length; ++i) {\n value += args[i](context);\n }\n return value;\n };\n }\n case Ops.Subtract: {\n return (context) => args[0](context) - args[1](context);\n }\n case Ops.Clamp: {\n return (context) => {\n const value = args[0](context);\n const min = args[1](context);\n if (value < min) {\n return min;\n }\n const max = args[2](context);\n if (value > max) {\n return max;\n }\n return value;\n };\n }\n case Ops.Mod: {\n return (context) => args[0](context) % args[1](context);\n }\n case Ops.Pow: {\n return (context) => Math.pow(args[0](context), args[1](context));\n }\n case Ops.Abs: {\n return (context) => Math.abs(args[0](context));\n }\n case Ops.Floor: {\n return (context) => Math.floor(args[0](context));\n }\n case Ops.Ceil: {\n return (context) => Math.ceil(args[0](context));\n }\n case Ops.Round: {\n return (context) => Math.round(args[0](context));\n }\n case Ops.Sin: {\n return (context) => Math.sin(args[0](context));\n }\n case Ops.Cos: {\n return (context) => Math.cos(args[0](context));\n }\n case Ops.Atan: {\n if (length === 2) {\n return (context) => Math.atan2(args[0](context), args[1](context));\n }\n return (context) => Math.atan(args[0](context));\n }\n case Ops.Sqrt: {\n return (context) => Math.sqrt(args[0](context));\n }\n default: {\n throw new Error(`Unsupported numeric operator ${op}`);\n }\n }\n}\n\n/**\n * @param {import('./expression.js').CallExpression} expression The call expression.\n * @param {import('./expression.js').ParsingContext} context The parsing context.\n * @return {ExpressionEvaluator} The evaluator function.\n */\nfunction compileCaseExpression(expression, context) {\n const length = expression.args.length;\n const args = new Array(length);\n for (let i = 0; i < length; ++i) {\n args[i] = compileExpression(expression.args[i], context);\n }\n return (context) => {\n for (let i = 0; i < length - 1; i += 2) {\n const condition = args[i](context);\n if (condition) {\n return args[i + 1](context);\n }\n }\n return args[length - 1](context);\n };\n}\n\n/**\n * @param {import('./expression.js').CallExpression} expression The call expression.\n * @param {import('./expression.js').ParsingContext} context The parsing context.\n * @return {ExpressionEvaluator} The evaluator function.\n */\nfunction compileMatchExpression(expression, context) {\n const length = expression.args.length;\n const args = new Array(length);\n for (let i = 0; i < length; ++i) {\n args[i] = compileExpression(expression.args[i], context);\n }\n return (context) => {\n const value = args[0](context);\n for (let i = 1; i < length - 1; i += 2) {\n if (value === args[i](context)) {\n return args[i + 1](context);\n }\n }\n return args[length - 1](context);\n };\n}\n\n/**\n * @param {import('./expression.js').CallExpression} expression The call expression.\n * @param {import('./expression.js').ParsingContext} context The parsing context.\n * @return {ExpressionEvaluator} The evaluator function.\n */\nfunction compileInterpolateExpression(expression, context) {\n const length = expression.args.length;\n const args = new Array(length);\n for (let i = 0; i < length; ++i) {\n args[i] = compileExpression(expression.args[i], context);\n }\n return (context) => {\n const base = args[0](context);\n const value = args[1](context);\n\n let previousInput;\n let previousOutput;\n for (let i = 2; i < length; i += 2) {\n const input = args[i](context);\n let output = args[i + 1](context);\n const isColor = Array.isArray(output);\n if (isColor) {\n output = withAlpha(output);\n }\n if (input >= value) {\n if (i === 2) {\n return output;\n }\n if (isColor) {\n return interpolateColor(\n base,\n value,\n previousInput,\n previousOutput,\n input,\n output,\n );\n }\n return interpolateNumber(\n base,\n value,\n previousInput,\n previousOutput,\n input,\n output,\n );\n }\n previousInput = input;\n previousOutput = output;\n }\n return previousOutput;\n };\n}\n\n/**\n * @param {import('./expression.js').CallExpression} expression The call expression.\n * @param {import('./expression.js').ParsingContext} context The parsing context.\n * @return {ExpressionEvaluator} The evaluator function.\n */\nfunction compileConvertExpression(expression, context) {\n const op = expression.operator;\n const length = expression.args.length;\n\n const args = new Array(length);\n for (let i = 0; i < length; ++i) {\n args[i] = compileExpression(expression.args[i], context);\n }\n switch (op) {\n case Ops.ToString: {\n return (context) => {\n const value = args[0](context);\n if (expression.args[0].type === ColorType) {\n return toString(value);\n }\n return value.toString();\n };\n }\n default: {\n throw new Error(`Unsupported convert operator ${op}`);\n }\n }\n}\n\n/**\n * @param {number} base The base.\n * @param {number} value The value.\n * @param {number} input1 The first input value.\n * @param {number} output1 The first output value.\n * @param {number} input2 The second input value.\n * @param {number} output2 The second output value.\n * @return {number} The interpolated value.\n */\nfunction interpolateNumber(base, value, input1, output1, input2, output2) {\n const delta = input2 - input1;\n if (delta === 0) {\n return output1;\n }\n const along = value - input1;\n const factor =\n base === 1\n ? along / delta\n : (Math.pow(base, along) - 1) / (Math.pow(base, delta) - 1);\n return output1 + factor * (output2 - output1);\n}\n\n/**\n * @param {number} base The base.\n * @param {number} value The value.\n * @param {number} input1 The first input value.\n * @param {import('../color.js').Color} rgba1 The first output value.\n * @param {number} input2 The second input value.\n * @param {import('../color.js').Color} rgba2 The second output value.\n * @return {import('../color.js').Color} The interpolated color.\n */\nfunction interpolateColor(base, value, input1, rgba1, input2, rgba2) {\n const delta = input2 - input1;\n if (delta === 0) {\n return rgba1;\n }\n const lcha1 = rgbaToLcha(rgba1);\n const lcha2 = rgbaToLcha(rgba2);\n let deltaHue = lcha2[2] - lcha1[2];\n if (deltaHue > 180) {\n deltaHue -= 360;\n } else if (deltaHue < -180) {\n deltaHue += 360;\n }\n\n const lcha = [\n interpolateNumber(base, value, input1, lcha1[0], input2, lcha2[0]),\n interpolateNumber(base, value, input1, lcha1[1], input2, lcha2[1]),\n lcha1[2] + interpolateNumber(base, value, input1, 0, input2, deltaHue),\n interpolateNumber(base, value, input1, rgba1[3], input2, rgba2[3]),\n ];\n return lchaToRgba(lcha);\n}\n","/**\n * @module ol/ImageState\n */\n\n/**\n * @enum {number}\n */\nexport default {\n IDLE: 0,\n LOADING: 1,\n LOADED: 2,\n ERROR: 3,\n EMPTY: 4,\n};\n","/**\n * @module ol/Image\n */\nimport ImageState from './ImageState.js';\nimport {listenOnce, unlistenByKey} from './events.js';\nimport EventType from './events/EventType.js';\nimport EventTarget from './events/Target.js';\nimport {toPromise} from './functions.js';\nimport {CREATE_IMAGE_BITMAP, IMAGE_DECODE} from './has.js';\n\n/**\n * A function that takes an {@link module:ol/Image~ImageWrapper} for the image and a\n * `{string}` for the src as arguments. It is supposed to make it so the\n * underlying image {@link module:ol/Image~ImageWrapper#getImage} is assigned the\n * content specified by the src. If not specified, the default is\n *\n * function(image, src) {\n * image.getImage().src = src;\n * }\n *\n * Providing a custom `imageLoadFunction` can be useful to load images with\n * post requests or - in general - through XHR requests, where the src of the\n * image element would be set to a data URI when the content is loaded.\n *\n * @typedef {function(import(\"./Image.js\").default, string): void} LoadFunction\n * @api\n */\n\n/**\n * @typedef {Object} ImageObject\n * @property {import(\"./extent.js\").Extent} [extent] Extent, if different from the requested one.\n * @property {import(\"./resolution.js\").ResolutionLike} [resolution] Resolution, if different from the requested one.\n * When x and y resolution are different, use the array type (`[xResolution, yResolution]`).\n * @property {number} [pixelRatio] Pixel ratio, if different from the requested one.\n * @property {import('./DataTile.js').ImageLike} image Image.\n */\n\n/**\n * Loader function used for image sources. Receives extent, resolution and pixel ratio as arguments.\n * For images that cover any extent and resolution (static images), the loader function should not accept\n * any arguments. The function returns an {@link import(\"./DataTile.js\").ImageLike image}, an\n * {@link import(\"./Image.js\").ImageObject image object}, or a promise for the same.\n * For loaders that generate images, the promise should not resolve until the image is loaded.\n * If the returned image does not match the extent, resolution or pixel ratio passed to the loader,\n * it has to return an {@link import(\"./Image.js\").ImageObject image object} with the `image` and the\n * correct `extent`, `resolution` and `pixelRatio`.\n *\n * @typedef {function(import(\"./extent.js\").Extent, number, number, (function(HTMLImageElement, string): void)=): import(\"./DataTile.js\").ImageLike|ImageObject|Promise} Loader\n * @api\n */\n\n/**\n * Loader function used for image sources. Receives extent, resolution and pixel ratio as arguments.\n * The function returns a promise for an {@link import(\"./Image.js\").ImageObject image object}.\n *\n * @typedef {function(import(\"./extent.js\").Extent, number, number, (function(HTMLImageElement, string): void)=): Promise} ImageObjectPromiseLoader\n */\n\nclass ImageWrapper extends EventTarget {\n /**\n * @param {import(\"./extent.js\").Extent} extent Extent.\n * @param {number|Array|undefined} resolution Resolution. If provided as array, x and y\n * resolution will be assumed.\n * @param {number} pixelRatio Pixel ratio.\n * @param {import(\"./ImageState.js\").default|Loader} stateOrLoader State.\n */\n constructor(extent, resolution, pixelRatio, stateOrLoader) {\n super();\n\n /**\n * @protected\n * @type {import(\"./extent.js\").Extent}\n */\n this.extent = extent;\n\n /**\n * @private\n * @type {number}\n */\n this.pixelRatio_ = pixelRatio;\n\n /**\n * @protected\n * @type {number|Array|undefined}\n */\n this.resolution = resolution;\n\n /**\n * @protected\n * @type {import(\"./ImageState.js\").default}\n */\n this.state =\n typeof stateOrLoader === 'function' ? ImageState.IDLE : stateOrLoader;\n\n /**\n * @private\n * @type {import('./DataTile.js').ImageLike|null}\n */\n this.image_ = null;\n\n /**\n * @protected\n * @type {Loader|null}\n */\n this.loader = typeof stateOrLoader === 'function' ? stateOrLoader : null;\n }\n\n /**\n * @protected\n */\n changed() {\n this.dispatchEvent(EventType.CHANGE);\n }\n\n /**\n * @return {import(\"./extent.js\").Extent} Extent.\n */\n getExtent() {\n return this.extent;\n }\n\n /**\n * @return {import('./DataTile.js').ImageLike} Image.\n */\n getImage() {\n return this.image_;\n }\n\n /**\n * @return {number} PixelRatio.\n */\n getPixelRatio() {\n return this.pixelRatio_;\n }\n\n /**\n * @return {number|Array} Resolution.\n */\n getResolution() {\n return /** @type {number} */ (this.resolution);\n }\n\n /**\n * @return {import(\"./ImageState.js\").default} State.\n */\n getState() {\n return this.state;\n }\n\n /**\n * Load not yet loaded URI.\n */\n load() {\n if (this.state == ImageState.IDLE) {\n if (this.loader) {\n this.state = ImageState.LOADING;\n this.changed();\n const resolution = this.getResolution();\n const requestResolution = Array.isArray(resolution)\n ? resolution[0]\n : resolution;\n toPromise(() =>\n this.loader(\n this.getExtent(),\n requestResolution,\n this.getPixelRatio(),\n ),\n )\n .then((image) => {\n if ('image' in image) {\n this.image_ = image.image;\n }\n if ('extent' in image) {\n this.extent = image.extent;\n }\n if ('resolution' in image) {\n this.resolution = image.resolution;\n }\n if ('pixelRatio' in image) {\n this.pixelRatio_ = image.pixelRatio;\n }\n if (\n image instanceof HTMLImageElement ||\n (CREATE_IMAGE_BITMAP && image instanceof ImageBitmap) ||\n image instanceof HTMLCanvasElement ||\n image instanceof HTMLVideoElement\n ) {\n this.image_ = image;\n }\n this.state = ImageState.LOADED;\n })\n .catch((error) => {\n this.state = ImageState.ERROR;\n console.error(error); // eslint-disable-line no-console\n })\n .finally(() => this.changed());\n }\n }\n }\n\n /**\n * @param {import('./DataTile.js').ImageLike} image The image.\n */\n setImage(image) {\n this.image_ = image;\n }\n\n /**\n * @param {number|Array} resolution Resolution.\n */\n setResolution(resolution) {\n this.resolution = resolution;\n }\n}\n\n/**\n * @param {import('./DataTile.js').ImageLike} image Image element.\n * @param {function():any} loadHandler Load callback function.\n * @param {function():any} errorHandler Error callback function.\n * @return {function():void} Callback to stop listening.\n */\nexport function listenImage(image, loadHandler, errorHandler) {\n const img = /** @type {HTMLImageElement} */ (image);\n let listening = true;\n let decoding = false;\n let loaded = false;\n\n const listenerKeys = [\n listenOnce(img, EventType.LOAD, function () {\n loaded = true;\n if (!decoding) {\n loadHandler();\n }\n }),\n ];\n\n if (img.src && IMAGE_DECODE) {\n decoding = true;\n img\n .decode()\n .then(function () {\n if (listening) {\n loadHandler();\n }\n })\n .catch(function (error) {\n if (listening) {\n if (loaded) {\n loadHandler();\n } else {\n errorHandler();\n }\n }\n });\n } else {\n listenerKeys.push(listenOnce(img, EventType.ERROR, errorHandler));\n }\n\n return function unlisten() {\n listening = false;\n listenerKeys.forEach(unlistenByKey);\n };\n}\n\n/**\n * Loads an image.\n * @param {HTMLImageElement} image Image, not yet loaded.\n * @param {string} [src] `src` attribute of the image. Optional, not required if already present.\n * @return {Promise} Promise resolving to an `HTMLImageElement`.\n * @api\n */\nexport function load(image, src) {\n return new Promise((resolve, reject) => {\n function handleLoad() {\n unlisten();\n resolve(image);\n }\n function handleError() {\n unlisten();\n reject(new Error('Image load error'));\n }\n function unlisten() {\n image.removeEventListener('load', handleLoad);\n image.removeEventListener('error', handleError);\n }\n image.addEventListener('load', handleLoad);\n image.addEventListener('error', handleError);\n if (src) {\n image.src = src;\n }\n });\n}\n\n/**\n * @param {HTMLImageElement} image Image, not yet loaded.\n * @param {string} [src] `src` attribute of the image. Optional, not required if already present.\n * @return {Promise} Promise resolving to an `HTMLImageElement`.\n */\nexport function decodeFallback(image, src) {\n if (src) {\n image.src = src;\n }\n return image.src && IMAGE_DECODE\n ? new Promise((resolve, reject) =>\n image\n .decode()\n .then(() => resolve(image))\n .catch((e) =>\n image.complete && image.width ? resolve(image) : reject(e),\n ),\n )\n : load(image);\n}\n\n/**\n * Loads an image and decodes it to an `ImageBitmap` if `createImageBitmap()` is supported. Returns\n * the loaded image otherwise.\n * @param {HTMLImageElement} image Image, not yet loaded.\n * @param {string} [src] `src` attribute of the image. Optional, not required if already present.\n * @return {Promise} Promise resolving to an `ImageBitmap` or an\n * `HTMLImageElement` if `createImageBitmap()` is not supported.\n * @api\n */\nexport function decode(image, src) {\n if (src) {\n image.src = src;\n }\n return image.src && IMAGE_DECODE && CREATE_IMAGE_BITMAP\n ? image\n .decode()\n .then(() => createImageBitmap(image))\n .catch((e) => {\n if (image.complete && image.width) {\n return image;\n }\n throw e;\n })\n : decodeFallback(image);\n}\n\nexport default ImageWrapper;\n","/**\n * @module ol/style/IconImageCache\n */\nimport ImageState from '../ImageState.js';\nimport {asArray} from '../color.js';\nimport {getSharedCanvasContext2D} from '../dom.js';\n\n/**\n * @classdesc\n * Singleton class. Available through {@link module:ol/style/IconImageCache.shared}.\n */\nclass IconImageCache {\n constructor() {\n /**\n * @type {!Object}\n * @private\n */\n this.cache_ = {};\n\n /**\n * @type {!Object}\n * @private\n */\n this.patternCache_ = {};\n\n /**\n * @type {number}\n * @private\n */\n this.cacheSize_ = 0;\n\n /**\n * @type {number}\n * @private\n */\n this.maxCacheSize_ = 1024;\n }\n\n /**\n * FIXME empty description for jsdoc\n */\n clear() {\n this.cache_ = {};\n this.patternCache_ = {};\n this.cacheSize_ = 0;\n }\n\n /**\n * @return {boolean} Can expire cache.\n */\n canExpireCache() {\n return this.cacheSize_ > this.maxCacheSize_;\n }\n\n /**\n * FIXME empty description for jsdoc\n */\n expire() {\n if (this.canExpireCache()) {\n let i = 0;\n for (const key in this.cache_) {\n const iconImage = this.cache_[key];\n if ((i++ & 3) === 0 && !iconImage.hasListener()) {\n delete this.cache_[key];\n delete this.patternCache_[key];\n --this.cacheSize_;\n }\n }\n }\n }\n\n /**\n * @param {string} src Src.\n * @param {import(\"../color.js\").Color|string|null} color Color.\n * @return {import(\"./IconImage.js\").default} Icon image.\n */\n get(src, color) {\n const key = getCacheKey(src, color);\n\n const icon = key in this.cache_ ? this.cache_[key] : null;\n return icon;\n }\n\n /**\n * @param {string} src Src.\n * @param {import(\"../color.js\").Color|string|null} color Color.\n * @return {CanvasPattern} Icon image.\n */\n getPattern(src, color) {\n const key = getCacheKey(src, color);\n return key in this.patternCache_ ? this.patternCache_[key] : null;\n }\n\n /**\n * @param {string} src Src.\n * @param {import(\"../color.js\").Color|string|null} color Color.\n * @param {import(\"./IconImage.js\").default|null} iconImage Icon image.\n * @param {boolean} [pattern] Also cache a `'repeat'` pattern with this `iconImage`.\n */\n set(src, color, iconImage, pattern) {\n const key = getCacheKey(src, color);\n const update = key in this.cache_;\n this.cache_[key] = iconImage;\n if (pattern) {\n if (iconImage.getImageState() === ImageState.IDLE) {\n iconImage.load();\n }\n if (iconImage.getImageState() === ImageState.LOADING) {\n iconImage.ready().then(() => {\n this.patternCache_[key] = getSharedCanvasContext2D().createPattern(\n iconImage.getImage(1),\n 'repeat',\n );\n });\n } else {\n this.patternCache_[key] = getSharedCanvasContext2D().createPattern(\n iconImage.getImage(1),\n 'repeat',\n );\n }\n }\n if (!update) {\n ++this.cacheSize_;\n }\n }\n\n /**\n * Set the cache size of the icon cache. Default is `1024`. Change this value when\n * your map uses more than 1024 different icon images and you are not caching icon\n * styles on the application level.\n * @param {number} maxCacheSize Cache max size.\n * @api\n */\n setSize(maxCacheSize) {\n this.maxCacheSize_ = maxCacheSize;\n this.expire();\n }\n}\n\n/**\n * @param {string} src Src.\n * @param {import(\"../color.js\").Color|string|null} color Color.\n * @return {string} Cache key.\n */\nexport function getCacheKey(src, color) {\n const colorString = color ? asArray(color) : 'null';\n return src + ':' + colorString;\n}\n\nexport default IconImageCache;\n\n/**\n * The {@link module:ol/style/IconImageCache~IconImageCache} for\n * {@link module:ol/style/Icon~Icon} images.\n * @api\n */\nexport const shared = new IconImageCache();\n","/**\n * @module ol/style/IconImage\n */\n\nimport {decodeFallback} from '../Image.js';\nimport ImageState from '../ImageState.js';\nimport {asString} from '../color.js';\nimport {createCanvasContext2D} from '../dom.js';\nimport EventType from '../events/EventType.js';\nimport EventTarget from '../events/Target.js';\nimport {shared as iconImageCache} from './IconImageCache.js';\n\n/**\n * @type {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D}\n */\nlet taintedTestContext = null;\n\nclass IconImage extends EventTarget {\n /**\n * @param {HTMLImageElement|HTMLCanvasElement|OffscreenCanvas|ImageBitmap|null} image Image.\n * @param {string|undefined} src Src.\n * @param {import('../dom.js').ImageAttributes} imageAttributes Image attributes options.\n * @param {import(\"../ImageState.js\").default|undefined} imageState Image state.\n * @param {import(\"../color.js\").Color|string|null} color Color.\n */\n constructor(image, src, imageAttributes, imageState, color) {\n super();\n\n /**\n * @private\n * @type {HTMLImageElement|OffscreenCanvas|HTMLCanvasElement|ImageBitmap}\n */\n this.hitDetectionImage_ = null;\n\n /**\n * @private\n * @type {HTMLImageElement|HTMLCanvasElement|OffscreenCanvas|ImageBitmap|null}\n */\n this.image_ = image;\n\n /**\n * @private\n * @type {string|null}\n */\n this.crossOrigin_ = imageAttributes?.crossOrigin;\n\n /**\n * @private\n * @type {ReferrerPolicy}\n */\n this.referrerPolicy_ = imageAttributes?.referrerPolicy;\n\n /**\n * @private\n * @type {Object}\n */\n this.canvas_ = {};\n\n /**\n * @private\n * @type {import(\"../color.js\").Color|string|null}\n */\n this.color_ = color;\n\n /**\n * @private\n * @type {import(\"../ImageState.js\").default}\n */\n this.imageState_ = imageState === undefined ? ImageState.IDLE : imageState;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size|null}\n */\n this.size_ =\n image && image.width && image.height ? [image.width, image.height] : null;\n\n /**\n * @private\n * @type {string|undefined}\n */\n this.src_ = src;\n\n /**\n * @private\n */\n this.tainted_;\n\n /**\n * @private\n * @type {Promise|null}\n */\n this.ready_ = null;\n }\n\n /**\n * @private\n */\n initializeImage_() {\n this.image_ = new Image();\n if (this.crossOrigin_ !== null) {\n this.image_.crossOrigin = this.crossOrigin_;\n }\n if (this.referrerPolicy_ !== undefined) {\n this.image_.referrerPolicy = this.referrerPolicy_;\n }\n }\n\n /**\n * @private\n * @return {boolean} The image canvas is tainted.\n */\n isTainted_() {\n if (this.tainted_ === undefined && this.imageState_ === ImageState.LOADED) {\n if (!taintedTestContext) {\n taintedTestContext = createCanvasContext2D(1, 1, undefined, {\n willReadFrequently: true,\n });\n }\n taintedTestContext.drawImage(this.image_, 0, 0);\n try {\n taintedTestContext.getImageData(0, 0, 1, 1);\n this.tainted_ = false;\n } catch {\n taintedTestContext = null;\n this.tainted_ = true;\n }\n }\n return this.tainted_ === true;\n }\n\n /**\n * @private\n */\n dispatchChangeEvent_() {\n this.dispatchEvent(EventType.CHANGE);\n }\n\n /**\n * @private\n */\n handleImageError_() {\n this.imageState_ = ImageState.ERROR;\n this.dispatchChangeEvent_();\n }\n\n /**\n * @private\n */\n handleImageLoad_() {\n this.imageState_ = ImageState.LOADED;\n this.size_ = [this.image_.width, this.image_.height];\n this.dispatchChangeEvent_();\n }\n\n /**\n * @param {number} pixelRatio Pixel ratio.\n * @return {HTMLImageElement|HTMLCanvasElement|OffscreenCanvas|ImageBitmap} Image or Canvas element or image bitmap.\n */\n getImage(pixelRatio) {\n if (!this.image_) {\n this.initializeImage_();\n }\n this.replaceColor_(pixelRatio);\n return this.canvas_[pixelRatio] ? this.canvas_[pixelRatio] : this.image_;\n }\n\n /**\n * @param {HTMLImageElement|HTMLCanvasElement|OffscreenCanvas|ImageBitmap} image Image.\n */\n setImage(image) {\n this.image_ = image;\n }\n\n /**\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Image or Canvas element.\n */\n getPixelRatio(pixelRatio) {\n this.replaceColor_(pixelRatio);\n return this.canvas_[pixelRatio] ? pixelRatio : 1;\n }\n\n /**\n * @return {import(\"../ImageState.js\").default} Image state.\n */\n getImageState() {\n return this.imageState_;\n }\n\n /**\n * @return {HTMLImageElement|HTMLCanvasElement|OffscreenCanvas|ImageBitmap} Image element.\n */\n getHitDetectionImage() {\n if (!this.image_) {\n this.initializeImage_();\n }\n if (!this.hitDetectionImage_) {\n if (this.isTainted_()) {\n const width = this.size_[0];\n const height = this.size_[1];\n const context = createCanvasContext2D(width, height);\n context.fillRect(0, 0, width, height);\n this.hitDetectionImage_ = context.canvas;\n } else {\n this.hitDetectionImage_ = this.image_;\n }\n }\n return this.hitDetectionImage_;\n }\n\n /**\n * Get the size of the icon (in pixels).\n * @return {import(\"../size.js\").Size} Image size.\n */\n getSize() {\n return this.size_;\n }\n\n /**\n * @return {string|undefined} Image src.\n */\n getSrc() {\n return this.src_;\n }\n\n /**\n * Load not yet loaded URI.\n */\n load() {\n if (this.imageState_ !== ImageState.IDLE) {\n return;\n }\n if (!this.image_) {\n this.initializeImage_();\n }\n\n this.imageState_ = ImageState.LOADING;\n try {\n if (this.src_ !== undefined) {\n /** @type {HTMLImageElement} */ (this.image_).src = this.src_;\n }\n } catch {\n this.handleImageError_();\n }\n if (this.image_ instanceof HTMLImageElement) {\n decodeFallback(this.image_, this.src_)\n .then((image) => {\n this.image_ = image;\n this.handleImageLoad_();\n })\n .catch(this.handleImageError_.bind(this));\n }\n }\n\n /**\n * @param {number} pixelRatio Pixel ratio.\n * @private\n */\n replaceColor_(pixelRatio) {\n if (\n !this.color_ ||\n this.canvas_[pixelRatio] ||\n this.imageState_ !== ImageState.LOADED\n ) {\n return;\n }\n\n const image = this.image_;\n const ctx = createCanvasContext2D(\n Math.ceil(image.width * pixelRatio),\n Math.ceil(image.height * pixelRatio),\n );\n const canvas = ctx.canvas;\n\n ctx.scale(pixelRatio, pixelRatio);\n ctx.drawImage(image, 0, 0);\n\n ctx.globalCompositeOperation = 'multiply';\n ctx.fillStyle = asString(this.color_);\n ctx.fillRect(0, 0, canvas.width / pixelRatio, canvas.height / pixelRatio);\n\n ctx.globalCompositeOperation = 'destination-in';\n ctx.drawImage(image, 0, 0);\n\n this.canvas_[pixelRatio] = canvas;\n }\n\n /**\n * @return {Promise} Promise that resolves when the image is loaded.\n */\n ready() {\n if (!this.ready_) {\n this.ready_ = new Promise((resolve) => {\n if (\n this.imageState_ === ImageState.LOADED ||\n this.imageState_ === ImageState.ERROR\n ) {\n resolve();\n } else {\n const onChange = () => {\n if (\n this.imageState_ === ImageState.LOADED ||\n this.imageState_ === ImageState.ERROR\n ) {\n this.removeEventListener(EventType.CHANGE, onChange);\n resolve();\n }\n };\n this.addEventListener(EventType.CHANGE, onChange);\n }\n });\n }\n return this.ready_;\n }\n}\n\n/**\n * @param {HTMLImageElement|HTMLCanvasElement|OffscreenCanvas|ImageBitmap|null} image Image.\n * @param {string|undefined} src Src.\n * @param {import('../dom.js').ImageAttributes} imageAttributes Image attributes options.\n * @param {import(\"../ImageState.js\").default|undefined} imageState Image state.\n * @param {import(\"../color.js\").Color|string|null} color Color.\n * @param {boolean} [pattern] Also cache a `repeat` pattern with the icon image.\n * @return {IconImage} Icon image.\n */\nexport function get(image, src, imageAttributes, imageState, color, pattern) {\n let iconImage =\n src === undefined ? undefined : iconImageCache.get(src, color);\n if (!iconImage) {\n iconImage = new IconImage(\n image,\n image && 'src' in image ? image.src || undefined : src,\n imageAttributes,\n imageState,\n color,\n );\n iconImageCache.set(src, color, iconImage, pattern);\n }\n if (pattern && iconImage && !iconImageCache.getPattern(src, color)) {\n iconImageCache.set(src, color, iconImage, pattern);\n }\n return iconImage;\n}\n\nexport default IconImage;\n","/**\n * @module ol/colorlike\n */\nimport ImageState from './ImageState.js';\nimport {toString} from './color.js';\nimport {createCanvasContext2D} from './dom.js';\nimport {get as getIconImage} from './style/IconImage.js';\nimport {shared as iconCache} from './style/IconImageCache.js';\n\n/**\n * @typedef {Object} PatternDescriptor\n * @property {string} src Pattern image URL\n * @property {import(\"./color.js\").Color|string} [color] Color to tint the pattern with.\n * @property {import(\"./size.js\").Size} [size] Size of the desired slice from the pattern image.\n * Use this together with `offset` when the pattern image is a sprite sheet.\n * @property {import(\"./size.js\").Size} [offset] Offset of the desired slice from the pattern image.\n * Use this together with `size` when the pattern image is a sprite sheet.\n */\n\n/**\n * A type accepted by CanvasRenderingContext2D.fillStyle\n * or CanvasRenderingContext2D.strokeStyle.\n * Represents a color, [CanvasPattern](https://developer.mozilla.org/en-US/docs/Web/API/CanvasPattern),\n * or [CanvasGradient](https://developer.mozilla.org/en-US/docs/Web/API/CanvasGradient). The origin for\n * patterns and gradients as fill style is an increment of 512 css pixels from map coordinate\n * `[0, 0]`. For seamless repeat patterns, width and height of the pattern image\n * must be a factor of two (2, 4, 8, ..., 512).\n *\n * @typedef {string|CanvasPattern|CanvasGradient} ColorLike\n * @api\n */\n\n/**\n * @param {import(\"./color.js\").Color|ColorLike|PatternDescriptor|null} color Color.\n * @return {ColorLike|null} The color as an {@link ol/colorlike~ColorLike}.\n * @api\n */\nexport function asColorLike(color) {\n if (!color) {\n return null;\n }\n if (Array.isArray(color)) {\n return toString(color);\n }\n if (typeof color === 'object' && 'src' in color) {\n return asCanvasPattern(color);\n }\n return color;\n}\n\n/**\n * @param {PatternDescriptor} pattern Pattern descriptor.\n * @return {CanvasPattern|null} Canvas pattern or null if the pattern referenced in the\n * PatternDescriptor was not found in the icon image cache.\n */\nfunction asCanvasPattern(pattern) {\n if (!pattern.offset || !pattern.size) {\n return iconCache.getPattern(pattern.src, pattern.color);\n }\n\n const cacheKey = pattern.src + ':' + pattern.offset;\n\n const canvasPattern = iconCache.getPattern(cacheKey, pattern.color);\n if (canvasPattern) {\n return canvasPattern;\n }\n\n const iconImage = iconCache.get(pattern.src, null);\n if (iconImage.getImageState() !== ImageState.LOADED) {\n return null;\n }\n const patternCanvasContext = createCanvasContext2D(\n pattern.size[0],\n pattern.size[1],\n );\n patternCanvasContext.drawImage(\n iconImage.getImage(1),\n pattern.offset[0],\n pattern.offset[1],\n pattern.size[0],\n pattern.size[1],\n 0,\n 0,\n pattern.size[0],\n pattern.size[1],\n );\n getIconImage(\n patternCanvasContext.canvas,\n cacheKey,\n undefined,\n ImageState.LOADED,\n pattern.color,\n true,\n );\n return iconCache.getPattern(cacheKey, pattern.color);\n}\n","/**\n * @module ol/render/canvas\n */\nimport BaseObject from '../Object.js';\nimport {fontWeights, getFontParameters} from '../css.js';\nimport {createCanvasContext2D} from '../dom.js';\nimport {WORKER_OFFSCREEN_CANVAS} from '../has.js';\nimport {clear} from '../obj.js';\n\n/**\n * @typedef {'Circle' | 'Image' | 'LineString' | 'Polygon' | 'Text' | 'Default'} BuilderType\n */\n\n/**\n * @typedef {Object} FillState\n * @property {import(\"../colorlike.js\").ColorLike} fillStyle FillStyle.\n */\n\n/**\n * @typedef Label\n * @property {number} width Width.\n * @property {number} height Height.\n * @property {Array} contextInstructions ContextInstructions.\n */\n\n/**\n * @typedef {Object} FillStrokeState\n * @property {import(\"../colorlike.js\").ColorLike} [currentFillStyle] Current FillStyle.\n * @property {import(\"../colorlike.js\").ColorLike} [currentStrokeStyle] Current StrokeStyle.\n * @property {CanvasLineCap} [currentLineCap] Current LineCap.\n * @property {Array} currentLineDash Current LineDash.\n * @property {number} [currentLineDashOffset] Current LineDashOffset.\n * @property {CanvasLineJoin} [currentLineJoin] Current LineJoin.\n * @property {number} [currentLineWidth] Current LineWidth.\n * @property {number} [currentMiterLimit] Current MiterLimit.\n * @property {number} [currentStrokeOffset] Current StrokeOffset.\n * @property {number} [lastStroke] Last stroke.\n * @property {import(\"../colorlike.js\").ColorLike} [fillStyle] FillStyle.\n * @property {import(\"../colorlike.js\").ColorLike} [strokeStyle] StrokeStyle.\n * @property {CanvasLineCap} [lineCap] LineCap.\n * @property {Array} lineDash LineDash.\n * @property {number} [lineDashOffset] LineDashOffset.\n * @property {CanvasLineJoin} [lineJoin] LineJoin.\n * @property {number} [lineWidth] LineWidth.\n * @property {number} [miterLimit] MiterLimit.\n * @property {number} [strokeOffset] StrokeOffset.\n * @property {number} [fillPatternScale] Fill pattern scale.\n */\n\n/**\n * @typedef {Object} StrokeState\n * @property {CanvasLineCap} lineCap LineCap.\n * @property {Array} lineDash LineDash.\n * @property {number} lineDashOffset LineDashOffset.\n * @property {CanvasLineJoin} lineJoin LineJoin.\n * @property {number} lineWidth LineWidth.\n * @property {number} miterLimit MiterLimit.\n * @property {number} [strokeOffset] StrokeOffset.\n * @property {import(\"../colorlike.js\").ColorLike} strokeStyle StrokeStyle.\n */\n\n/**\n * @typedef {Object} TextState\n * @property {string} font Font.\n * @property {CanvasTextAlign} [textAlign] TextAlign.\n * @property {number} [repeat] Repeat.\n * @property {import(\"../style/Text.js\").TextJustify} [justify] Justify.\n * @property {CanvasTextBaseline} textBaseline TextBaseline.\n * @property {import(\"../style/Text.js\").TextPlacement} [placement] Placement.\n * @property {number} [maxAngle] MaxAngle.\n * @property {boolean} [overflow] Overflow.\n * @property {import(\"../style/Fill.js\").default} [backgroundFill] BackgroundFill.\n * @property {import(\"../style/Stroke.js\").default} [backgroundStroke] BackgroundStroke.\n * @property {import(\"../size.js\").Size} [scale] Scale.\n * @property {Array} [padding] Padding.\n */\n\n/**\n * @typedef {Object} SerializableInstructions\n * @property {Array<*>} instructions The rendering instructions.\n * @property {Array<*>} hitDetectionInstructions The rendering hit detection instructions.\n * @property {Array} coordinates The array of all coordinates.\n * @property {!Object} [textStates] The text states (decluttering).\n * @property {!Object} [fillStates] The fill states (decluttering).\n * @property {!Object} [strokeStates] The stroke states (decluttering).\n */\n\n/**\n * @typedef {Object} DeclutterImageWithText\n */\n\n/**\n * @const\n * @type {string}\n */\nexport const defaultFont = '10px sans-serif';\n\n/**\n * @const\n * @type {string}\n */\nexport const defaultFillStyle = '#000';\n\n/**\n * @const\n * @type {CanvasLineCap}\n */\nexport const defaultLineCap = 'round';\n\n/**\n * @const\n * @type {Array}\n */\nexport const defaultLineDash = [];\n\n/**\n * @const\n * @type {number}\n */\nexport const defaultLineDashOffset = 0;\n\n/**\n * @const\n * @type {CanvasLineJoin}\n */\nexport const defaultLineJoin = 'round';\n\n/**\n * @const\n * @type {number}\n */\nexport const defaultMiterLimit = 10;\n\n/**\n * @const\n * @type {number}\n */\nexport const defaultStrokeOffset = 0;\n\n/**\n * @const\n * @type {import(\"../colorlike.js\").ColorLike}\n */\nexport const defaultStrokeStyle = '#000';\n\n/**\n * @const\n * @type {CanvasTextAlign}\n */\nexport const defaultTextAlign = 'center';\n\n/**\n * @const\n * @type {CanvasTextBaseline}\n */\nexport const defaultTextBaseline = 'middle';\n\n/**\n * @const\n * @type {Array}\n */\nexport const defaultPadding = [0, 0, 0, 0];\n\n/**\n * @const\n * @type {number}\n */\nexport const defaultLineWidth = 1;\n\n/**\n * @type {BaseObject}\n */\nexport const checkedFonts = new BaseObject();\n\n/**\n * @type {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D}\n */\nlet measureContext = null;\n\n/**\n * @type {string}\n */\nlet measureFont;\n\n/**\n * @type {!Object}\n */\nexport const textHeights = {};\n\nconst genericFontFamilies = new Set([\n 'serif',\n 'sans-serif',\n 'monospace',\n 'cursive',\n 'fantasy',\n 'system-ui',\n 'ui-serif',\n 'ui-sans-serif',\n 'ui-monospace',\n 'ui-rounded',\n 'emoji',\n 'math',\n 'fangsong',\n]);\n\n/**\n * @param {string} style Css font-style\n * @param {string} weight Css font-weight\n * @param {string} family Css font-family\n * @return {string} Font key.\n */\nfunction getFontKey(style, weight, family) {\n return `${style} ${weight} 16px \"${family}\"`;\n}\n\n/**\n * Clears the label cache when a font becomes available.\n * @param {string} fontSpec CSS font spec.\n */\nexport const registerFont = (function () {\n const retries = 100;\n let timeout, fontFaceSet;\n\n /**\n * @param {string} fontSpec Css font spec\n * @return {Promise} Font with style and weight is available\n */\n async function isAvailable(fontSpec) {\n await fontFaceSet.ready;\n const font = getFontParameters(fontSpec);\n const checkFamily = font.families[0].toLowerCase();\n const checkWeight = font.weight;\n /** @type {Array} */\n const matching = [];\n fontFaceSet.forEach(\n /**\n * @param {FontFace} f Font face.\n */\n (f) => {\n const family = f.family.replace(/^['\"]|['\"]$/g, '').toLowerCase();\n const weight = fontWeights[f.weight] || f.weight;\n if (\n family === checkFamily &&\n f.style === font.style &&\n weight == checkWeight\n ) {\n matching.push(f);\n }\n },\n );\n if (matching.length === 0) {\n return false;\n }\n // Load each matching face with `FontFace.load()` instead of querying the\n // set with `FontFaceSet.load()`. The latter only resolves faces whose\n // `unicode-range` covers its (default) test string, so subset fonts -\n // e.g. those served by Google Fonts - would never be detected.\n const loaded = await Promise.all(\n matching.map((f) =>\n f.load().then(\n () => true, // available\n () => false, // not available\n ),\n ),\n );\n return loaded.some((available) => available);\n }\n\n async function check() {\n await fontFaceSet.ready;\n let done = true;\n const checkedFontsProperties = checkedFonts.getProperties();\n const fonts = Object.keys(checkedFontsProperties).filter(\n (key) => checkedFontsProperties[key] < retries,\n );\n for (let i = fonts.length - 1; i >= 0; --i) {\n const font = fonts[i];\n let currentRetries = checkedFontsProperties[font];\n if (currentRetries < retries) {\n if (await isAvailable(font)) {\n clear(textHeights);\n checkedFonts.set(font, retries);\n } else {\n currentRetries += 10;\n checkedFonts.set(font, currentRetries, true);\n if (currentRetries < retries) {\n done = false;\n }\n }\n }\n }\n timeout = undefined;\n if (!done) {\n timeout = setTimeout(check, 100);\n }\n }\n\n return async function (fontSpec) {\n if (!fontFaceSet) {\n fontFaceSet = WORKER_OFFSCREEN_CANVAS ? self.fonts : document.fonts;\n }\n const font = getFontParameters(fontSpec);\n if (!font) {\n return;\n }\n const families = font.families;\n let needCheck = false;\n for (const family of families) {\n if (genericFontFamilies.has(family)) {\n continue;\n }\n const key = getFontKey(font.style, font.weight, family);\n if (checkedFonts.get(key) !== undefined) {\n continue;\n }\n checkedFonts.set(key, 0, true);\n needCheck = true;\n }\n if (needCheck) {\n clearTimeout(timeout);\n timeout = setTimeout(check, 100);\n }\n };\n})();\n\n/**\n * @param {string} font Font to use for measuring.\n * @return {import(\"../size.js\").Size} Measurement.\n */\nexport const measureTextHeight = (function () {\n /**\n * @type {HTMLDivElement}\n */\n let measureElement;\n return function (fontSpec) {\n let height = textHeights[fontSpec];\n if (height == undefined) {\n if (WORKER_OFFSCREEN_CANVAS) {\n const font = getFontParameters(fontSpec);\n const metrics = measureText(fontSpec, 'Žg');\n const lineHeight = isNaN(Number(font.lineHeight))\n ? 1.2\n : Number(font.lineHeight);\n height =\n lineHeight *\n (metrics.actualBoundingBoxAscent + metrics.actualBoundingBoxDescent);\n } else {\n if (!measureElement) {\n measureElement = document.createElement('div');\n measureElement.innerHTML = 'M';\n measureElement.style.minHeight = '0';\n measureElement.style.maxHeight = 'none';\n measureElement.style.height = 'auto';\n measureElement.style.padding = '0';\n measureElement.style.border = 'none';\n measureElement.style.position = 'absolute';\n measureElement.style.display = 'block';\n measureElement.style.left = '-99999px';\n }\n measureElement.style.font = fontSpec;\n document.body.appendChild(measureElement);\n height = measureElement.offsetHeight;\n document.body.removeChild(measureElement);\n }\n textHeights[fontSpec] = height;\n }\n return height;\n };\n})();\n\n/**\n * @param {string} font Font.\n * @param {string} text Text.\n * @return {TextMetrics} Text metrics.\n */\nfunction measureText(font, text) {\n if (!measureContext) {\n measureContext = createCanvasContext2D(1, 1);\n }\n if (font != measureFont) {\n measureContext.font = font;\n measureFont = measureContext.font;\n }\n return measureContext.measureText(text);\n}\n\n/**\n * @param {string} font Font.\n * @param {string} text Text.\n * @return {number} Width.\n */\nexport function measureTextWidth(font, text) {\n return measureText(font, text).width;\n}\n\n/**\n * Measure text width using a cache.\n * @param {string} font The font.\n * @param {string} text The text to measure.\n * @param {Object} cache A lookup of cached widths by text.\n * @return {number} The text width.\n */\nexport function measureAndCacheTextWidth(font, text, cache) {\n if (text in cache) {\n return cache[text];\n }\n const width = text\n .split('\\n')\n .reduce((prev, curr) => Math.max(prev, measureTextWidth(font, curr)), 0);\n cache[text] = width;\n return width;\n}\n\n/**\n * @param {TextState} baseStyle Base style.\n * @param {Array} chunks Text chunks to measure.\n * @return {{width: number, height: number, widths: Array, heights: Array, lineWidths: Array}}} Text metrics.\n */\nexport function getTextDimensions(baseStyle, chunks) {\n const widths = [];\n const heights = [];\n const lineWidths = [];\n let width = 0;\n let lineWidth = 0;\n let height = 0;\n let lineHeight = 0;\n for (let i = 0, ii = chunks.length; i <= ii; i += 2) {\n const text = chunks[i];\n if (text === '\\n' || i === ii) {\n width = Math.max(width, lineWidth);\n lineWidths.push(lineWidth);\n lineWidth = 0;\n height += lineHeight;\n lineHeight = 0;\n continue;\n }\n const font = chunks[i + 1] || baseStyle.font;\n const currentWidth = measureTextWidth(font, text);\n widths.push(currentWidth);\n lineWidth += currentWidth;\n const currentHeight = measureTextHeight(font);\n heights.push(currentHeight);\n lineHeight = Math.max(lineHeight, currentHeight);\n }\n return {width, height, widths, heights, lineWidths};\n}\n\n/**\n * @param {CanvasRenderingContext2D} context Context.\n * @param {number} rotation Rotation.\n * @param {number} offsetX X offset.\n * @param {number} offsetY Y offset.\n */\nexport function rotateAtOffset(context, rotation, offsetX, offsetY) {\n if (rotation !== 0) {\n context.translate(offsetX, offsetY);\n context.rotate(rotation);\n context.translate(-offsetX, -offsetY);\n }\n}\n\n/**\n * @param {CanvasRenderingContext2D|import(\"../render/canvas/ZIndexContext.js\").ZIndexContextProxy} context Context.\n * @param {import(\"../transform.js\").Transform|null} transform Transform.\n * @param {number} opacity Opacity.\n * @param {Label|HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} labelOrImage Label.\n * @param {number} originX Origin X.\n * @param {number} originY Origin Y.\n * @param {number} w Width.\n * @param {number} h Height.\n * @param {number} x X.\n * @param {number} y Y.\n * @param {import(\"../size.js\").Size} scale Scale.\n */\nexport function drawImageOrLabel(\n context,\n transform,\n opacity,\n labelOrImage,\n originX,\n originY,\n w,\n h,\n x,\n y,\n scale,\n) {\n context.save();\n\n if (opacity !== 1) {\n if (context.globalAlpha === undefined) {\n context.globalAlpha = (context) => (context.globalAlpha *= opacity);\n } else {\n context.globalAlpha *= opacity;\n }\n }\n if (transform) {\n context.transform.apply(context, transform);\n }\n\n if (/** @type {*} */ (labelOrImage).contextInstructions) {\n // label\n context.translate(x, y);\n context.scale(scale[0], scale[1]);\n executeLabelInstructions(/** @type {Label} */ (labelOrImage), context);\n } else if (scale[0] < 0 || scale[1] < 0) {\n // flipped image\n context.translate(x, y);\n context.scale(scale[0], scale[1]);\n context.drawImage(\n /** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */ (\n labelOrImage\n ),\n originX,\n originY,\n w,\n h,\n 0,\n 0,\n w,\n h,\n );\n } else {\n // if image not flipped translate and scale can be avoided\n context.drawImage(\n /** @type {HTMLCanvasElement|HTMLImageElement|HTMLVideoElement} */ (\n labelOrImage\n ),\n originX,\n originY,\n w,\n h,\n x,\n y,\n w * scale[0],\n h * scale[1],\n );\n }\n\n context.restore();\n}\n\n/**\n * @param {Label} label Label.\n * @param {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D} context Context.\n */\nfunction executeLabelInstructions(label, context) {\n const contextInstructions = label.contextInstructions;\n for (let i = 0, ii = contextInstructions.length; i < ii; i += 2) {\n if (Array.isArray(contextInstructions[i + 1])) {\n context[contextInstructions[i]].apply(\n context,\n contextInstructions[i + 1],\n );\n } else {\n context[contextInstructions[i]] = contextInstructions[i + 1];\n }\n }\n}\n","/**\n * @module ol/style/Image\n */\nimport {toSize} from '../size.js';\nimport {abstract} from '../util.js';\n\n/**\n * @typedef {Object} Options\n * @property {number} opacity Opacity.\n * @property {boolean} rotateWithView If the image should get rotated with the view.\n * @property {number} rotation Rotation.\n * @property {number|import(\"../size.js\").Size} scale Scale.\n * @property {Array} displacement Displacement.\n * @property {import('../style/Style.js').DeclutterMode} declutterMode Declutter mode: `declutter`, `obstacle`, `none`.\n */\n\n/**\n * @classdesc\n * A base class used for creating subclasses and not instantiated in\n * apps. Base class for {@link module:ol/style/Icon~Icon}, {@link module:ol/style/Circle~CircleStyle} and\n * {@link module:ol/style/RegularShape~RegularShape}.\n * @abstract\n * @api\n */\nclass ImageStyle {\n /**\n * @param {Options} options Options.\n */\n constructor(options) {\n /**\n * @private\n * @type {number}\n */\n this.opacity_ = options.opacity;\n\n /**\n * @private\n * @type {boolean}\n */\n this.rotateWithView_ = options.rotateWithView;\n\n /**\n * @private\n * @type {number}\n */\n this.rotation_ = options.rotation;\n\n /**\n * @private\n * @type {number|import(\"../size.js\").Size}\n */\n this.scale_ = options.scale;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.scaleArray_ = toSize(options.scale);\n\n /**\n * @private\n * @type {Array}\n */\n this.displacement_ = options.displacement;\n\n /**\n * @private\n * @type {import('../style/Style.js').DeclutterMode}\n */\n this.declutterMode_ = options.declutterMode;\n }\n\n /**\n * Clones the style.\n * @return {ImageStyle} The cloned style.\n * @api\n */\n clone() {\n const scale = this.getScale();\n return new ImageStyle({\n opacity: this.getOpacity(),\n scale: Array.isArray(scale) ? scale.slice() : scale,\n rotation: this.getRotation(),\n rotateWithView: this.getRotateWithView(),\n displacement: this.getDisplacement().slice(),\n declutterMode: this.getDeclutterMode(),\n });\n }\n\n /**\n * Get the symbolizer opacity.\n * @return {number} Opacity.\n * @api\n */\n getOpacity() {\n return this.opacity_;\n }\n\n /**\n * Determine whether the symbolizer rotates with the map.\n * @return {boolean} Rotate with map.\n * @api\n */\n getRotateWithView() {\n return this.rotateWithView_;\n }\n\n /**\n * Get the symoblizer rotation.\n * @return {number} Rotation.\n * @api\n */\n getRotation() {\n return this.rotation_;\n }\n\n /**\n * Get the symbolizer scale.\n * @return {number|import(\"../size.js\").Size} Scale.\n * @api\n */\n getScale() {\n return this.scale_;\n }\n\n /**\n * Get the symbolizer scale array.\n * @return {import(\"../size.js\").Size} Scale array.\n */\n getScaleArray() {\n return this.scaleArray_;\n }\n\n /**\n * Get the displacement of the shape\n * @return {Array} Shape's center displacement\n * @api\n */\n getDisplacement() {\n return this.displacement_;\n }\n\n /**\n * Get the declutter mode of the shape\n * @return {import(\"./Style.js\").DeclutterMode} Shape's declutter mode\n * @api\n */\n getDeclutterMode() {\n return this.declutterMode_;\n }\n\n /**\n * Get the anchor point in pixels. The anchor determines the center point for the\n * symbolizer.\n * @abstract\n * @return {Array} Anchor.\n */\n getAnchor() {\n return abstract();\n }\n\n /**\n * Get the image element for the symbolizer.\n * @abstract\n * @param {number} pixelRatio Pixel ratio.\n * @return {import('../DataTile.js').ImageLike} Image element.\n */\n getImage(pixelRatio) {\n return abstract();\n }\n\n /**\n * @abstract\n * @return {import('../DataTile.js').ImageLike} Image element.\n */\n getHitDetectionImage() {\n return abstract();\n }\n\n /**\n * Get the image pixel ratio.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Pixel ratio.\n */\n getPixelRatio(pixelRatio) {\n return 1;\n }\n\n /**\n * @abstract\n * @return {import(\"../ImageState.js\").default} Image state.\n */\n getImageState() {\n return abstract();\n }\n\n /**\n * @abstract\n * @return {import(\"../size.js\").Size} Image size.\n */\n getImageSize() {\n return abstract();\n }\n\n /**\n * Get the origin of the symbolizer.\n * @abstract\n * @return {Array} Origin.\n */\n getOrigin() {\n return abstract();\n }\n\n /**\n * Get the size of the symbolizer (in pixels).\n * @abstract\n * @return {import(\"../size.js\").Size} Size.\n */\n getSize() {\n return abstract();\n }\n\n /**\n * Set the displacement.\n *\n * @param {Array} displacement Displacement.\n * @api\n */\n setDisplacement(displacement) {\n this.displacement_ = displacement;\n }\n\n /**\n * Set the opacity.\n *\n * @param {number} opacity Opacity.\n * @api\n */\n setOpacity(opacity) {\n this.opacity_ = opacity;\n }\n\n /**\n * Set whether to rotate the style with the view.\n *\n * @param {boolean} rotateWithView Rotate with map.\n * @api\n */\n setRotateWithView(rotateWithView) {\n this.rotateWithView_ = rotateWithView;\n }\n\n /**\n * Set the rotation.\n *\n * @param {number} rotation Rotation.\n * @api\n */\n setRotation(rotation) {\n this.rotation_ = rotation;\n }\n\n /**\n * Set the scale.\n *\n * @param {number|import(\"../size.js\").Size} scale Scale.\n * @api\n */\n setScale(scale) {\n this.scale_ = scale;\n this.scaleArray_ = toSize(scale);\n }\n\n /**\n * @abstract\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n listenImageChange(listener) {\n abstract();\n }\n\n /**\n * Load not yet loaded URI.\n * @abstract\n */\n load() {\n abstract();\n }\n\n /**\n * @abstract\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n */\n unlistenImageChange(listener) {\n abstract();\n }\n\n /**\n * @return {Promise} `false` or Promise that resolves when the style is ready to use.\n */\n ready() {\n return Promise.resolve();\n }\n}\n\nexport default ImageStyle;\n","/**\n * @module ol/style/RegularShape\n */\n\nimport ImageState from '../ImageState.js';\nimport {asArray} from '../color.js';\nimport {asColorLike} from '../colorlike.js';\nimport {createCanvasContext2D} from '../dom.js';\nimport {\n defaultFillStyle,\n defaultLineCap,\n defaultLineJoin,\n defaultLineWidth,\n defaultMiterLimit,\n defaultStrokeStyle,\n} from '../render/canvas.js';\nimport IconImage from './IconImage.js';\nimport {shared as iconImageCache} from './IconImageCache.js';\nimport ImageStyle from './Image.js';\n\n/**\n * Specify radius for regular polygons, or both radius and radius2 for stars.\n * @typedef {Object} Options\n * @property {import(\"./Fill.js\").default} [fill] Fill style.\n * @property {number} points Number of points for stars and regular polygons. In case of a polygon, the number of points\n * is the number of sides.\n * @property {number} radius Radius of a regular polygon.\n * @property {number} [radius2] Second radius to make a star instead of a regular polygon.\n * @property {number} [angle=0] Shape's angle in radians. A value of 0 will have one of the shape's points facing up.\n * @property {Array} [displacement=[0, 0]] Displacement of the shape in pixels.\n * Positive values will shift the shape right and up.\n * @property {import(\"./Stroke.js\").default} [stroke] Stroke style.\n * @property {number} [rotation=0] Rotation in radians (positive rotation clockwise).\n * @property {boolean} [rotateWithView=false] Whether to rotate the shape with the view.\n * @property {number|import(\"../size.js\").Size} [scale=1] Scale. Unless two dimensional scaling is required a better\n * result may be obtained with appropriate settings for `radius` and `radius2`.\n * @property {import('./Style.js').DeclutterMode} [declutterMode] Declutter mode.\n */\n\n/**\n * @typedef {Object} RenderOptions\n * @property {import(\"../colorlike.js\").ColorLike|undefined} strokeStyle StrokeStyle.\n * @property {number} strokeWidth StrokeWidth.\n * @property {number} size Size.\n * @property {CanvasLineCap} lineCap LineCap.\n * @property {Array|null} lineDash LineDash.\n * @property {number} lineDashOffset LineDashOffset.\n * @property {CanvasLineJoin} lineJoin LineJoin.\n * @property {number} miterLimit MiterLimit.\n */\n\n/**\n * @classdesc\n * Set regular shape style for vector features. The resulting shape will be\n * a regular polygon when `radius` is provided, or a star when both `radius` and\n * `radius2` are provided.\n * @api\n */\nclass RegularShape extends ImageStyle {\n /**\n * @param {Options} options Options.\n */\n constructor(options) {\n super({\n opacity: 1,\n rotateWithView:\n options.rotateWithView !== undefined ? options.rotateWithView : false,\n rotation: options.rotation !== undefined ? options.rotation : 0,\n scale: options.scale !== undefined ? options.scale : 1,\n displacement:\n options.displacement !== undefined ? options.displacement : [0, 0],\n declutterMode: options.declutterMode,\n });\n\n /**\n * @private\n * @type {HTMLCanvasElement|OffscreenCanvas|null}\n */\n this.hitDetectionCanvas_ = null;\n\n /**\n * @private\n * @type {import(\"./Fill.js\").default|null}\n */\n this.fill_ = options.fill !== undefined ? options.fill : null;\n\n /**\n * @private\n * @type {Array}\n */\n this.origin_ = [0, 0];\n\n /**\n * @private\n * @type {number}\n */\n this.points_ = options.points;\n\n /**\n * @protected\n * @type {number}\n */\n this.radius = options.radius;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.radius2_ = options.radius2;\n\n /**\n * @private\n * @type {number}\n */\n this.angle_ = options.angle !== undefined ? options.angle : 0;\n\n /**\n * @private\n * @type {import(\"./Stroke.js\").default|null}\n */\n this.stroke_ = options.stroke !== undefined ? options.stroke : null;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.size_;\n\n /**\n * @private\n * @type {RenderOptions}\n */\n this.renderOptions_;\n\n /**\n * @private\n */\n this.imageState_ =\n this.fill_ && this.fill_.loading()\n ? ImageState.LOADING\n : ImageState.LOADED;\n if (this.imageState_ === ImageState.LOADING) {\n this.ready().then(() => (this.imageState_ = ImageState.LOADED));\n }\n this.render();\n }\n\n /**\n * Clones the style.\n * @return {RegularShape} The cloned style.\n * @api\n * @override\n */\n clone() {\n const scale = this.getScale();\n const style = new RegularShape({\n fill: this.getFill() ? this.getFill().clone() : undefined,\n points: this.getPoints(),\n radius: this.getRadius(),\n radius2: this.getRadius2(),\n angle: this.getAngle(),\n stroke: this.getStroke() ? this.getStroke().clone() : undefined,\n rotation: this.getRotation(),\n rotateWithView: this.getRotateWithView(),\n scale: Array.isArray(scale) ? scale.slice() : scale,\n displacement: this.getDisplacement().slice(),\n declutterMode: this.getDeclutterMode(),\n });\n style.setOpacity(this.getOpacity());\n return style;\n }\n\n /**\n * Get the anchor point in pixels. The anchor determines the center point for the\n * symbolizer.\n * @return {Array} Anchor.\n * @api\n * @override\n */\n getAnchor() {\n const size = this.size_;\n const displacement = this.getDisplacement();\n const scale = this.getScaleArray();\n // anchor is scaled by renderer but displacement should not be scaled\n // so divide by scale here\n return [\n size[0] / 2 - displacement[0] / scale[0],\n size[1] / 2 + displacement[1] / scale[1],\n ];\n }\n\n /**\n * Get the angle used in generating the shape.\n * @return {number} Shape's rotation in radians.\n * @api\n */\n getAngle() {\n return this.angle_;\n }\n\n /**\n * Get the fill style for the shape.\n * @return {import(\"./Fill.js\").default|null} Fill style.\n * @api\n */\n getFill() {\n return this.fill_;\n }\n\n /**\n * Set the fill style.\n * @param {import(\"./Fill.js\").default|null} fill Fill style.\n * @api\n */\n setFill(fill) {\n this.fill_ = fill;\n this.render();\n }\n\n /**\n * @return {HTMLCanvasElement|OffscreenCanvas} Image element.\n * @override\n */\n getHitDetectionImage() {\n if (!this.hitDetectionCanvas_) {\n this.hitDetectionCanvas_ = this.createHitDetectionCanvas_(\n this.renderOptions_,\n );\n }\n return this.hitDetectionCanvas_;\n }\n\n /**\n * Get the image icon.\n * @param {number} pixelRatio Pixel ratio.\n * @return {HTMLCanvasElement|OffscreenCanvas} Image or Canvas element.\n * @api\n * @override\n */\n getImage(pixelRatio) {\n const fillKey = this.fill_?.getKey();\n const cacheKey =\n `${pixelRatio},${this.angle_},${this.radius},${this.radius2_},${this.points_},${fillKey}` +\n Object.values(this.renderOptions_).join(',');\n let image = /** @type {HTMLCanvasElement|OffscreenCanvas} */ (\n iconImageCache.get(cacheKey, null)?.getImage(1)\n );\n if (!image) {\n const renderOptions = this.renderOptions_;\n const size = Math.ceil(renderOptions.size * pixelRatio);\n const context = createCanvasContext2D(size, size);\n this.draw_(renderOptions, context, pixelRatio);\n\n image = context.canvas;\n const iconImage = new IconImage(\n image,\n undefined,\n null,\n ImageState.LOADED,\n null,\n );\n iconImageCache.set(cacheKey, null, iconImage);\n // Update the image in place to an ImageBitmap for better performance and lower memory usage\n createImageBitmap(image).then((imageBitmap) => {\n iconImage.setImage(imageBitmap);\n });\n }\n return image;\n }\n\n /**\n * Get the image pixel ratio.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} Pixel ratio.\n * @override\n */\n getPixelRatio(pixelRatio) {\n return pixelRatio;\n }\n\n /**\n * @return {import(\"../size.js\").Size} Image size.\n * @override\n */\n getImageSize() {\n return this.size_;\n }\n\n /**\n * @return {import(\"../ImageState.js\").default} Image state.\n * @override\n */\n getImageState() {\n return this.imageState_;\n }\n\n /**\n * Get the origin of the symbolizer.\n * @return {Array} Origin.\n * @api\n * @override\n */\n getOrigin() {\n return this.origin_;\n }\n\n /**\n * Get the number of points for generating the shape.\n * @return {number} Number of points for stars and regular polygons.\n * @api\n */\n getPoints() {\n return this.points_;\n }\n\n /**\n * Get the (primary) radius for the shape.\n * @return {number} Radius.\n * @api\n */\n getRadius() {\n return this.radius;\n }\n\n /**\n * Set the (primary) radius for the shape.\n * @param {number} radius Radius.\n * @api\n */\n setRadius(radius) {\n if (this.radius === radius) {\n return;\n }\n this.radius = radius;\n this.render();\n }\n\n /**\n * Get the secondary radius for the shape.\n * @return {number|undefined} Radius2.\n * @api\n */\n getRadius2() {\n return this.radius2_;\n }\n\n /**\n * Set the secondary radius for the shape.\n * @param {number|undefined} radius2 Radius2.\n * @api\n */\n setRadius2(radius2) {\n if (this.radius2_ === radius2) {\n return;\n }\n this.radius2_ = radius2;\n this.render();\n }\n\n /**\n * Get the size of the symbolizer (in pixels).\n * @return {import(\"../size.js\").Size} Size.\n * @api\n * @override\n */\n getSize() {\n return this.size_;\n }\n\n /**\n * Get the stroke style for the shape.\n * @return {import(\"./Stroke.js\").default|null} Stroke style.\n * @api\n */\n getStroke() {\n return this.stroke_;\n }\n\n /**\n * Set the stroke style.\n * @param {import(\"./Stroke.js\").default|null} stroke Stroke style.\n * @api\n */\n setStroke(stroke) {\n this.stroke_ = stroke;\n this.render();\n }\n\n /**\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n * @override\n */\n listenImageChange(listener) {}\n\n /**\n * Load not yet loaded URI.\n * @override\n */\n load() {}\n\n /**\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n * @override\n */\n unlistenImageChange(listener) {}\n\n /**\n * Calculate additional canvas size needed for the miter.\n * @param {string} lineJoin Line join\n * @param {number} strokeWidth Stroke width\n * @param {number} miterLimit Miter limit\n * @return {number} Additional canvas size needed\n * @private\n */\n calculateLineJoinSize_(lineJoin, strokeWidth, miterLimit) {\n if (\n strokeWidth === 0 ||\n this.points_ === Infinity ||\n (lineJoin !== 'bevel' && lineJoin !== 'miter')\n ) {\n return strokeWidth;\n }\n // m | ^\n // i | |\\ .\n // t >| #\\\n // e | |\\ \\ .\n // r \\s\\\n // | \\t\\ . .\n // \\r\\ . .\n // | \\o\\ . . . . .\n // e \\k\\ . . . .\n // | \\e\\ . . . . .\n // d \\ \\ . . . .\n // | _ _a_ _\\# . . .\n // r1 / ` . .\n // | . .\n // b / . .\n // | . .\n // / r2 . .\n // | . .\n // / . .\n // |α . .\n // / . .\n // ° center\n let r1 = this.radius;\n let r2 = this.radius2_ === undefined ? r1 : this.radius2_;\n if (r1 < r2) {\n const tmp = r1;\n r1 = r2;\n r2 = tmp;\n }\n const points =\n this.radius2_ === undefined ? this.points_ : this.points_ * 2;\n const alpha = (2 * Math.PI) / points;\n const a = r2 * Math.sin(alpha);\n const b = Math.sqrt(r2 * r2 - a * a);\n const d = r1 - b;\n const e = Math.sqrt(a * a + d * d);\n const miterRatio = e / a;\n if (lineJoin === 'miter' && miterRatio <= miterLimit) {\n return miterRatio * strokeWidth;\n }\n // Calculate the distance from center to the stroke corner where\n // it was cut short because of the miter limit.\n // l\n // ----+---- <= distance from center to here is maxr\n // /####|k ##\\\n // /#####^#####\\\n // /#### /+\\# s #\\\n // /### h/+++\\# t #\\\n // /### t/+++++\\# r #\\\n // /### a/+++++++\\# o #\\\n // /### p/++ fill +\\# k #\\\n ///#### /+++++^+++++\\# e #\\\n //#####/+++++/+\\+++++\\#####\\\n const k = strokeWidth / 2 / miterRatio;\n const l = (strokeWidth / 2) * (d / e);\n const maxr = Math.sqrt((r1 + k) * (r1 + k) + l * l);\n const bevelAdd = maxr - r1;\n if (this.radius2_ === undefined || lineJoin === 'bevel') {\n return bevelAdd * 2;\n }\n // If outer miter is over the miter limit the inner miter may reach through the\n // center and be longer than the bevel, same calculation as above but swap r1 / r2.\n const aa = r1 * Math.sin(alpha);\n const bb = Math.sqrt(r1 * r1 - aa * aa);\n const dd = r2 - bb;\n const ee = Math.sqrt(aa * aa + dd * dd);\n const innerMiterRatio = ee / aa;\n if (innerMiterRatio <= miterLimit) {\n const innerLength = (innerMiterRatio * strokeWidth) / 2 - r2 - r1;\n return 2 * Math.max(bevelAdd, innerLength);\n }\n return bevelAdd * 2;\n }\n\n /**\n * @return {RenderOptions} The render options\n * @protected\n */\n createRenderOptions() {\n let lineCap = defaultLineCap;\n let lineJoin = defaultLineJoin;\n let miterLimit = 0;\n let lineDash = null;\n let lineDashOffset = 0;\n let strokeStyle;\n let strokeWidth = 0;\n\n if (this.stroke_) {\n strokeStyle = asColorLike(this.stroke_.getColor() ?? defaultStrokeStyle);\n strokeWidth = this.stroke_.getWidth() ?? defaultLineWidth;\n lineDash = this.stroke_.getLineDash();\n lineDashOffset = this.stroke_.getLineDashOffset() ?? 0;\n lineJoin = this.stroke_.getLineJoin() ?? defaultLineJoin;\n lineCap = this.stroke_.getLineCap() ?? defaultLineCap;\n miterLimit = this.stroke_.getMiterLimit() ?? defaultMiterLimit;\n }\n\n const add = this.calculateLineJoinSize_(lineJoin, strokeWidth, miterLimit);\n const maxRadius = Math.max(this.radius, this.radius2_ || 0);\n const size = Math.ceil(2 * maxRadius + add);\n\n return {\n strokeStyle: strokeStyle,\n strokeWidth: strokeWidth,\n size: size,\n lineCap: lineCap,\n lineDash: lineDash,\n lineDashOffset: lineDashOffset,\n lineJoin: lineJoin,\n miterLimit: miterLimit,\n };\n }\n\n /**\n * @protected\n */\n render() {\n this.renderOptions_ = this.createRenderOptions();\n const size = this.renderOptions_.size;\n this.hitDetectionCanvas_ = null;\n this.size_ = [size, size];\n }\n\n /**\n * @private\n * @param {RenderOptions} renderOptions Render options.\n * @param {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D} context The rendering context.\n * @param {number} pixelRatio The pixel ratio.\n */\n draw_(renderOptions, context, pixelRatio) {\n context.scale(pixelRatio, pixelRatio);\n // set origin to canvas center\n context.translate(renderOptions.size / 2, renderOptions.size / 2);\n\n this.createPath_(context);\n\n if (this.fill_) {\n let color = this.fill_.getColor();\n if (color === null) {\n color = defaultFillStyle;\n }\n context.fillStyle = asColorLike(color);\n context.fill();\n }\n if (renderOptions.strokeStyle) {\n context.strokeStyle = renderOptions.strokeStyle;\n context.lineWidth = renderOptions.strokeWidth;\n if (renderOptions.lineDash) {\n context.setLineDash(renderOptions.lineDash);\n context.lineDashOffset = renderOptions.lineDashOffset;\n }\n context.lineCap = renderOptions.lineCap;\n context.lineJoin = renderOptions.lineJoin;\n context.miterLimit = renderOptions.miterLimit;\n context.stroke();\n }\n }\n\n /**\n * @private\n * @param {RenderOptions} renderOptions Render options.\n * @return {HTMLCanvasElement|OffscreenCanvas} Canvas containing the icon\n */\n createHitDetectionCanvas_(renderOptions) {\n let context;\n if (this.fill_) {\n let color = this.fill_.getColor();\n\n // determine if fill is transparent (or pattern or gradient)\n let opacity = 0;\n if (typeof color === 'string') {\n color = asArray(color);\n }\n if (color === null) {\n opacity = 1;\n } else if (Array.isArray(color)) {\n opacity = color.length === 4 ? color[3] : 1;\n }\n if (opacity === 0) {\n // if a transparent fill style is set, create an extra hit-detection image\n // with a default fill style\n context = createCanvasContext2D(renderOptions.size, renderOptions.size);\n this.drawHitDetectionCanvas_(renderOptions, context);\n }\n }\n return context ? context.canvas : this.getImage(1);\n }\n\n /**\n * @private\n * @param {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D} context The context to draw in.\n */\n createPath_(context) {\n let points = this.points_;\n const radius = this.radius;\n if (points === Infinity) {\n context.arc(0, 0, radius, 0, 2 * Math.PI);\n } else {\n const radius2 = this.radius2_ === undefined ? radius : this.radius2_;\n if (this.radius2_ !== undefined) {\n points *= 2;\n }\n const startAngle = this.angle_ - Math.PI / 2;\n const step = (2 * Math.PI) / points;\n for (let i = 0; i < points; i++) {\n const angle0 = startAngle + i * step;\n const radiusC = i % 2 === 0 ? radius : radius2;\n context.lineTo(radiusC * Math.cos(angle0), radiusC * Math.sin(angle0));\n }\n context.closePath();\n }\n }\n\n /**\n * @private\n * @param {RenderOptions} renderOptions Render options.\n * @param {CanvasRenderingContext2D|OffscreenCanvasRenderingContext2D} context The context.\n */\n drawHitDetectionCanvas_(renderOptions, context) {\n // set origin to canvas center\n context.translate(renderOptions.size / 2, renderOptions.size / 2);\n\n this.createPath_(context);\n\n context.fillStyle = defaultFillStyle;\n context.fill();\n if (renderOptions.strokeStyle) {\n context.strokeStyle = renderOptions.strokeStyle;\n context.lineWidth = renderOptions.strokeWidth;\n if (renderOptions.lineDash) {\n context.setLineDash(renderOptions.lineDash);\n context.lineDashOffset = renderOptions.lineDashOffset;\n }\n context.lineJoin = renderOptions.lineJoin;\n context.miterLimit = renderOptions.miterLimit;\n context.stroke();\n }\n }\n\n /**\n * @override\n */\n ready() {\n return this.fill_ ? this.fill_.ready() : Promise.resolve();\n }\n}\n\nexport default RegularShape;\n","/**\n * @module ol/style/Circle\n */\n\nimport RegularShape from './RegularShape.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"./Fill.js\").default} [fill] Fill style.\n * @property {number} radius Circle radius.\n * @property {import(\"./Stroke.js\").default} [stroke] Stroke style.\n * @property {Array} [displacement=[0,0]] displacement\n * @property {number|import(\"../size.js\").Size} [scale=1] Scale. A two dimensional scale will produce an ellipse.\n * Unless two dimensional scaling is required a better result may be obtained with an appropriate setting for `radius`.\n * @property {number} [rotation=0] Rotation in radians\n * (positive rotation clockwise, meaningful only when used in conjunction with a two dimensional scale).\n * @property {boolean} [rotateWithView=false] Whether to rotate the shape with the view\n * (meaningful only when used in conjunction with a two dimensional scale).\n * @property {import('./Style.js').DeclutterMode} [declutterMode] Declutter mode\n */\n\n/**\n * @classdesc\n * Set circle style for vector features.\n * @api\n */\nclass CircleStyle extends RegularShape {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options ? options : {radius: 5};\n\n super({\n points: Infinity,\n fill: options.fill,\n radius: options.radius,\n stroke: options.stroke,\n scale: options.scale !== undefined ? options.scale : 1,\n rotation: options.rotation !== undefined ? options.rotation : 0,\n rotateWithView:\n options.rotateWithView !== undefined ? options.rotateWithView : false,\n displacement:\n options.displacement !== undefined ? options.displacement : [0, 0],\n declutterMode: options.declutterMode,\n });\n }\n\n /**\n * Clones the style.\n * @return {CircleStyle} The cloned style.\n * @api\n * @override\n */\n clone() {\n const scale = this.getScale();\n const style = new CircleStyle({\n fill: this.getFill() ? this.getFill().clone() : undefined,\n stroke: this.getStroke() ? this.getStroke().clone() : undefined,\n radius: this.getRadius(),\n scale: Array.isArray(scale) ? scale.slice() : scale,\n rotation: this.getRotation(),\n rotateWithView: this.getRotateWithView(),\n displacement: this.getDisplacement().slice(),\n declutterMode: this.getDeclutterMode(),\n });\n style.setOpacity(this.getOpacity());\n return style;\n }\n}\n\nexport default CircleStyle;\n","/**\n * @module ol/style/Fill\n */\n\nimport ImageState from '../ImageState.js';\nimport {asArray} from '../color.js';\nimport {getUid} from '../util.js';\nimport {get as getIconImage} from './IconImage.js';\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|import('../colorlike.js').PatternDescriptor|null} [color=null] A color,\n * gradient or pattern.\n * See {@link module:ol/color~Color} and {@link module:ol/colorlike~ColorLike} for possible formats. For polygon fills (not for {@link import(\"./RegularShape.js\").default} fills),\n * a pattern can also be provided as {@link module:ol/colorlike~PatternDescriptor}.\n * Default null; if null, the Canvas/renderer default black will be used.\n */\n\n/**\n * @classdesc\n * Set fill style for vector features.\n * @api\n */\nclass Fill {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options || {};\n\n /**\n * @private\n * @type {import(\"./IconImage.js\").default|null}\n */\n this.patternImage_ = null;\n\n /**\n * @private\n * @type {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|import('../colorlike.js').PatternDescriptor|null}\n */\n this.color_ = null;\n if (options.color !== undefined) {\n this.setColor(options.color);\n }\n }\n\n /**\n * Clones the style. The color is not cloned if it is a {@link module:ol/colorlike~ColorLike}.\n * @return {Fill} The cloned style.\n * @api\n */\n clone() {\n const color = this.getColor();\n return new Fill({\n color: Array.isArray(color) ? color.slice() : color || undefined,\n });\n }\n\n /**\n * Get the fill color.\n * @return {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|import('../colorlike.js').PatternDescriptor|null} Color.\n * @api\n */\n getColor() {\n return this.color_;\n }\n\n /**\n * Set the color.\n *\n * @param {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike|import('../colorlike.js').PatternDescriptor|null} color Color.\n * @api\n */\n setColor(color) {\n if (color !== null && typeof color === 'object' && 'src' in color) {\n const patternImage = getIconImage(\n null,\n color.src,\n {crossOrigin: 'anonymous'},\n undefined,\n color.offset ? null : color.color ? color.color : null,\n !(color.offset && color.size),\n );\n patternImage.ready().then(() => {\n this.patternImage_ = null;\n });\n if (patternImage.getImageState() === ImageState.IDLE) {\n patternImage.load();\n }\n if (patternImage.getImageState() === ImageState.LOADING) {\n this.patternImage_ = patternImage;\n }\n }\n this.color_ = color;\n }\n\n /**\n * @return {string} Key of the fill for cache lookup.\n */\n getKey() {\n const fill = this.getColor();\n if (!fill) {\n return '';\n }\n return fill instanceof CanvasPattern || fill instanceof CanvasGradient\n ? getUid(fill)\n : typeof fill === 'object' && 'src' in fill\n ? fill.src + ':' + fill.offset\n : asArray(fill).toString();\n }\n\n /**\n * @return {boolean} The fill style is loading an image pattern.\n */\n loading() {\n return !!this.patternImage_;\n }\n\n /**\n * @return {Promise} `false` or a promise that resolves when the style is ready to use.\n */\n ready() {\n return this.patternImage_ ? this.patternImage_.ready() : Promise.resolve();\n }\n}\n\nexport default Fill;\n","/**\n * @module ol/style/Icon\n */\nimport ImageState from '../ImageState.js';\nimport {assert} from '../asserts.js';\nimport {asArray} from '../color.js';\nimport EventType from '../events/EventType.js';\nimport {getUid} from '../util.js';\nimport {get as getIconImage} from './IconImage.js';\nimport ImageStyle from './Image.js';\n\n/**\n * @typedef {'fraction' | 'pixels'} IconAnchorUnits\n * Anchor unit can be either a fraction of the icon size or in pixels.\n */\n\n/**\n * @typedef {'bottom-left' | 'bottom-right' | 'top-left' | 'top-right'} IconOrigin\n * Icon origin. One of 'bottom-left', 'bottom-right', 'top-left', 'top-right'.\n */\n\n/**\n * @typedef {Object} Options\n * @property {Array} [anchor=[0.5, 0.5]] Anchor. Default value is the icon center.\n * @property {IconOrigin} [anchorOrigin='top-left'] Origin of the anchor: `bottom-left`, `bottom-right`,\n * `top-left` or `top-right`.\n * @property {IconAnchorUnits} [anchorXUnits='fraction'] Units in which the anchor x value is\n * specified. A value of `'fraction'` indicates the x value is a fraction of the icon. A value of `'pixels'` indicates\n * the x value in pixels.\n * @property {IconAnchorUnits} [anchorYUnits='fraction'] Units in which the anchor y value is\n * specified. A value of `'fraction'` indicates the y value is a fraction of the icon. A value of `'pixels'` indicates\n * the y value in pixels.\n * @property {import(\"../color.js\").Color|string} [color] Color to tint the icon. If not specified,\n * the icon will be left as is.\n * @property {null|string} [crossOrigin] The `crossOrigin` attribute for loaded images. Note that you must provide a\n * `crossOrigin` value if you want to access pixel data with the Canvas renderer.\n * See https://developer.mozilla.org/en-US/docs/Web/HTML/CORS_enabled_image for more detail.\n * @property {ReferrerPolicy} [referrerPolicy] The `referrerPolicy` property for loaded images.\n * @property {HTMLImageElement|HTMLCanvasElement|OffscreenCanvas|ImageBitmap} [img] Image object for the icon.\n * @property {Array} [displacement=[0, 0]] Displacement of the icon in pixels.\n * Positive values will shift the icon right and up.\n * @property {number} [opacity=1] Opacity of the icon.\n * @property {number} [width] The width of the icon in pixels. This can't be used together with `scale`.\n * @property {number} [height] The height of the icon in pixels. This can't be used together with `scale`.\n * @property {number|import(\"../size.js\").Size} [scale=1] Scale.\n * @property {boolean} [rotateWithView=false] Whether to rotate the icon with the view.\n * @property {number} [rotation=0] Rotation in radians (positive rotation clockwise).\n * @property {Array} [offset=[0, 0]] Offset which, together with `size` and `offsetOrigin`, defines the\n * sub-rectangle to use from the original (sprite) image.\n * @property {IconOrigin} [offsetOrigin='top-left'] Origin of the offset: `bottom-left`, `bottom-right`,\n * `top-left` or `top-right`.\n * @property {import(\"../size.js\").Size} [size] Icon size in pixels. Used together with `offset` to define the\n * sub-rectangle to use from the original (sprite) image.\n * @property {string} [src] Image source URI.\n * @property {import(\"./Style.js\").DeclutterMode} [declutterMode] Declutter mode.\n */\n\n/**\n * @param {number} width The width.\n * @param {number} height The height.\n * @param {number|undefined} wantedWidth The wanted width.\n * @param {number|undefined} wantedHeight The wanted height.\n * @return {number|Array} The scale.\n */\nfunction calculateScale(width, height, wantedWidth, wantedHeight) {\n if (wantedWidth !== undefined && wantedHeight !== undefined) {\n return [wantedWidth / width, wantedHeight / height];\n }\n if (wantedWidth !== undefined) {\n return wantedWidth / width;\n }\n if (wantedHeight !== undefined) {\n return wantedHeight / height;\n }\n return 1;\n}\n\n/**\n * @classdesc\n * Set icon style for vector features.\n * @api\n */\nclass Icon extends ImageStyle {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options || {};\n\n /**\n * @type {number}\n */\n const opacity = options.opacity !== undefined ? options.opacity : 1;\n\n /**\n * @type {number}\n */\n const rotation = options.rotation !== undefined ? options.rotation : 0;\n\n /**\n * @type {number|import(\"../size.js\").Size}\n */\n const scale = options.scale !== undefined ? options.scale : 1;\n\n /**\n * @type {boolean}\n */\n const rotateWithView =\n options.rotateWithView !== undefined ? options.rotateWithView : false;\n\n super({\n opacity: opacity,\n rotation: rotation,\n scale: scale,\n displacement:\n options.displacement !== undefined ? options.displacement : [0, 0],\n rotateWithView: rotateWithView,\n declutterMode: options.declutterMode,\n });\n\n /**\n * @private\n * @type {Array}\n */\n this.anchor_ = options.anchor !== undefined ? options.anchor : [0.5, 0.5];\n\n /**\n * @private\n * @type {Array}\n */\n this.normalizedAnchor_ = null;\n\n /**\n * @private\n * @type {IconOrigin}\n */\n this.anchorOrigin_ =\n options.anchorOrigin !== undefined ? options.anchorOrigin : 'top-left';\n\n /**\n * @private\n * @type {IconAnchorUnits}\n */\n this.anchorXUnits_ =\n options.anchorXUnits !== undefined ? options.anchorXUnits : 'fraction';\n\n /**\n * @private\n * @type {IconAnchorUnits}\n */\n this.anchorYUnits_ =\n options.anchorYUnits !== undefined ? options.anchorYUnits : 'fraction';\n\n /**\n * @private\n * @type {?string}\n */\n this.crossOrigin_ =\n options.crossOrigin !== undefined ? options.crossOrigin : null;\n\n /**\n * @private\n * @type {ReferrerPolicy}\n */\n this.referrerPolicy_ = options.referrerPolicy;\n\n const image = options.img !== undefined ? options.img : null;\n\n let cacheKey = options.src;\n\n assert(\n !(cacheKey !== undefined && image),\n '`image` and `src` cannot be provided at the same time',\n );\n\n if ((cacheKey === undefined || cacheKey.length === 0) && image) {\n cacheKey = /** @type {HTMLImageElement} */ (image).src || getUid(image);\n }\n assert(\n cacheKey !== undefined && cacheKey.length > 0,\n 'A defined and non-empty `src` or `image` must be provided',\n );\n\n assert(\n !(\n (options.width !== undefined || options.height !== undefined) &&\n options.scale !== undefined\n ),\n '`width` or `height` cannot be provided together with `scale`',\n );\n\n let imageState;\n if (options.src !== undefined) {\n imageState = ImageState.IDLE;\n } else if (image !== undefined) {\n if ('complete' in image) {\n if (image.complete) {\n imageState = image.src ? ImageState.LOADED : ImageState.IDLE;\n } else {\n imageState = ImageState.LOADING;\n }\n } else {\n imageState = ImageState.LOADED;\n }\n }\n\n /**\n * @private\n * @type {import(\"../color.js\").Color}\n */\n this.color_ = options.color !== undefined ? asArray(options.color) : null;\n\n /**\n * @private\n * @type {import(\"./IconImage.js\").default}\n */\n this.iconImage_ = getIconImage(\n image,\n /** @type {string} */ (cacheKey),\n {\n crossOrigin: this.crossOrigin_,\n referrerPolicy: this.referrerPolicy_,\n },\n imageState,\n this.color_,\n );\n\n /**\n * @private\n * @type {Array}\n */\n this.offset_ = options.offset !== undefined ? options.offset : [0, 0];\n /**\n * @private\n * @type {IconOrigin}\n */\n this.offsetOrigin_ =\n options.offsetOrigin !== undefined ? options.offsetOrigin : 'top-left';\n\n /**\n * @private\n * @type {Array}\n */\n this.origin_ = null;\n\n /**\n * @private\n * @type {import(\"../size.js\").Size}\n */\n this.size_ = options.size !== undefined ? options.size : null;\n\n /**\n * @private\n */\n this.initialOptions_;\n\n /**\n * Calculate the scale if width or height were given.\n */\n if (options.width !== undefined || options.height !== undefined) {\n let width, height;\n if (options.size) {\n [width, height] = options.size;\n } else {\n const image = this.getImage(1);\n if (image.width && image.height) {\n width = image.width;\n height = image.height;\n } else if (image instanceof HTMLImageElement) {\n this.initialOptions_ = options;\n const onload = () => {\n this.unlistenImageChange(onload);\n if (!this.initialOptions_) {\n return;\n }\n const imageSize = this.iconImage_.getSize();\n this.setScale(\n calculateScale(\n imageSize[0],\n imageSize[1],\n options.width,\n options.height,\n ),\n );\n };\n this.listenImageChange(onload);\n return;\n }\n }\n if (width !== undefined) {\n this.setScale(\n calculateScale(width, height, options.width, options.height),\n );\n }\n }\n }\n\n /**\n * Clones the style. The underlying Image/HTMLCanvasElement is not cloned.\n * @return {Icon} The cloned style.\n * @api\n * @override\n */\n clone() {\n let scale, width, height;\n if (this.initialOptions_) {\n width = this.initialOptions_.width;\n height = this.initialOptions_.height;\n } else {\n scale = this.getScale();\n scale = Array.isArray(scale) ? scale.slice() : scale;\n }\n return new Icon({\n anchor: this.anchor_.slice(),\n anchorOrigin: this.anchorOrigin_,\n anchorXUnits: this.anchorXUnits_,\n anchorYUnits: this.anchorYUnits_,\n color:\n this.color_ && this.color_.slice\n ? this.color_.slice()\n : this.color_ || undefined,\n crossOrigin: this.crossOrigin_,\n referrerPolicy: this.referrerPolicy_,\n offset: this.offset_.slice(),\n offsetOrigin: this.offsetOrigin_,\n opacity: this.getOpacity(),\n rotateWithView: this.getRotateWithView(),\n rotation: this.getRotation(),\n scale,\n width,\n height,\n size: this.size_ !== null ? this.size_.slice() : undefined,\n src: this.getSrc(),\n displacement: this.getDisplacement().slice(),\n declutterMode: this.getDeclutterMode(),\n });\n }\n\n /**\n * Get the anchor point in pixels. The anchor determines the center point for the\n * symbolizer.\n * @return {Array} Anchor.\n * @api\n * @override\n */\n getAnchor() {\n let anchor = this.normalizedAnchor_;\n if (!anchor) {\n anchor = this.anchor_;\n const size = this.getSize();\n if (\n this.anchorXUnits_ == 'fraction' ||\n this.anchorYUnits_ == 'fraction'\n ) {\n if (!size) {\n return null;\n }\n anchor = this.anchor_.slice();\n if (this.anchorXUnits_ == 'fraction') {\n anchor[0] *= size[0];\n }\n if (this.anchorYUnits_ == 'fraction') {\n anchor[1] *= size[1];\n }\n }\n\n if (this.anchorOrigin_ != 'top-left') {\n if (!size) {\n return null;\n }\n if (anchor === this.anchor_) {\n anchor = this.anchor_.slice();\n }\n if (\n this.anchorOrigin_ == 'top-right' ||\n this.anchorOrigin_ == 'bottom-right'\n ) {\n anchor[0] = -anchor[0] + size[0];\n }\n if (\n this.anchorOrigin_ == 'bottom-left' ||\n this.anchorOrigin_ == 'bottom-right'\n ) {\n anchor[1] = -anchor[1] + size[1];\n }\n }\n this.normalizedAnchor_ = anchor;\n }\n const displacement = this.getDisplacement();\n const scale = this.getScaleArray();\n // anchor is scaled by renderer but displacement should not be scaled\n // so divide by scale here\n return [\n anchor[0] - displacement[0] / scale[0],\n anchor[1] + displacement[1] / scale[1],\n ];\n }\n\n /**\n * Set the anchor point. The anchor determines the center point for the\n * symbolizer.\n *\n * @param {Array} anchor Anchor.\n * @api\n */\n setAnchor(anchor) {\n this.anchor_ = anchor;\n this.normalizedAnchor_ = null;\n }\n\n /**\n * Get the icon color.\n * @return {import(\"../color.js\").Color} Color.\n * @api\n */\n getColor() {\n return this.color_;\n }\n\n /**\n * Set the icon color.\n *\n * Warning: Repeatedly setting the color on an icon style\n * causes the icon image to be re-created each time. This can have a\n * severe performance impact.\n *\n * @param {import(\"../color.js\").Color|string|null|undefined} color Color.\n */\n setColor(color) {\n const nextColor = color ? asArray(color) : null;\n if (\n this.color_ === nextColor ||\n (this.color_ &&\n nextColor &&\n this.color_.length === nextColor.length &&\n this.color_.every((value, index) => value === nextColor[index]))\n ) {\n // Discard if the color hasn't changed.\n return;\n }\n\n this.color_ = nextColor;\n const src = this.getSrc();\n const image = src !== undefined ? null : this.getHitDetectionImage();\n const imageState =\n src !== undefined ? ImageState.IDLE : this.iconImage_.getImageState();\n this.iconImage_ = getIconImage(\n image,\n src,\n {\n crossOrigin: this.crossOrigin_,\n referrerPolicy: this.referrerPolicy_,\n },\n imageState,\n this.color_,\n );\n }\n\n /**\n * Get the image icon.\n * @param {number} pixelRatio Pixel ratio.\n * @return {HTMLImageElement|HTMLCanvasElement|OffscreenCanvas|ImageBitmap} Image or Canvas element. If the Icon\n * style was configured with `src` or with a not let loaded `img`, an `ImageBitmap` will be returned.\n * @api\n * @override\n */\n getImage(pixelRatio) {\n return this.iconImage_.getImage(pixelRatio);\n }\n\n /**\n * Get the pixel ratio.\n * @param {number} pixelRatio Pixel ratio.\n * @return {number} The pixel ratio of the image.\n * @api\n * @override\n */\n getPixelRatio(pixelRatio) {\n return this.iconImage_.getPixelRatio(pixelRatio);\n }\n\n /**\n * @return {import(\"../size.js\").Size} Image size.\n * @override\n */\n getImageSize() {\n return this.iconImage_.getSize();\n }\n\n /**\n * @return {import(\"../ImageState.js\").default} Image state.\n * @override\n */\n getImageState() {\n return this.iconImage_.getImageState();\n }\n\n /**\n * @return {HTMLImageElement|HTMLCanvasElement|OffscreenCanvas|ImageBitmap} Image element.\n * @override\n */\n getHitDetectionImage() {\n return this.iconImage_.getHitDetectionImage();\n }\n\n /**\n * Get the origin of the symbolizer.\n * @return {Array} Origin.\n * @api\n * @override\n */\n getOrigin() {\n if (this.origin_) {\n return this.origin_;\n }\n let offset = this.offset_;\n\n if (this.offsetOrigin_ != 'top-left') {\n const size = this.getSize();\n const iconImageSize = this.iconImage_.getSize();\n if (!size || !iconImageSize) {\n return null;\n }\n offset = offset.slice();\n if (\n this.offsetOrigin_ == 'top-right' ||\n this.offsetOrigin_ == 'bottom-right'\n ) {\n offset[0] = iconImageSize[0] - size[0] - offset[0];\n }\n if (\n this.offsetOrigin_ == 'bottom-left' ||\n this.offsetOrigin_ == 'bottom-right'\n ) {\n offset[1] = iconImageSize[1] - size[1] - offset[1];\n }\n }\n this.origin_ = offset;\n return this.origin_;\n }\n\n /**\n * Get the image URL.\n * @return {string|undefined} Image src.\n * @api\n */\n getSrc() {\n return this.iconImage_.getSrc();\n }\n\n /**\n * Set the image URI\n * @param {string} src Image source URI\n * @api\n */\n setSrc(src) {\n this.iconImage_ = getIconImage(\n null,\n src,\n {\n crossOrigin: this.crossOrigin_,\n referrerPolicy: this.referrerPolicy_,\n },\n ImageState.IDLE,\n this.color_,\n );\n }\n\n /**\n * Get the size of the icon (in pixels).\n * @return {import(\"../size.js\").Size} Image size.\n * @api\n * @override\n */\n getSize() {\n return !this.size_ ? this.iconImage_.getSize() : this.size_;\n }\n\n /**\n * Get the width of the icon (in pixels). Will return undefined when the icon image is not yet loaded.\n * @return {number} Icon width (in pixels).\n * @api\n */\n getWidth() {\n const scale = this.getScaleArray();\n if (this.size_) {\n return this.size_[0] * scale[0];\n }\n if (this.iconImage_.getImageState() == ImageState.LOADED) {\n return this.iconImage_.getSize()[0] * scale[0];\n }\n return undefined;\n }\n\n /**\n * Get the height of the icon (in pixels). Will return undefined when the icon image is not yet loaded.\n * @return {number} Icon height (in pixels).\n * @api\n */\n getHeight() {\n const scale = this.getScaleArray();\n if (this.size_) {\n return this.size_[1] * scale[1];\n }\n if (this.iconImage_.getImageState() == ImageState.LOADED) {\n return this.iconImage_.getSize()[1] * scale[1];\n }\n return undefined;\n }\n\n /**\n * Set the scale.\n *\n * @param {number|import(\"../size.js\").Size} scale Scale.\n * @api\n * @override\n */\n setScale(scale) {\n delete this.initialOptions_;\n super.setScale(scale);\n }\n\n /**\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n * @override\n */\n listenImageChange(listener) {\n this.iconImage_.addEventListener(EventType.CHANGE, listener);\n }\n\n /**\n * Load not yet loaded URI.\n * When rendering a feature with an icon style, the vector renderer will\n * automatically call this method. However, you might want to call this\n * method yourself for preloading or other purposes.\n * @api\n * @override\n */\n load() {\n this.iconImage_.load();\n }\n\n /**\n * @param {function(import(\"../events/Event.js\").default): void} listener Listener function.\n * @override\n */\n unlistenImageChange(listener) {\n this.iconImage_.removeEventListener(EventType.CHANGE, listener);\n }\n\n /**\n * @override\n */\n ready() {\n return this.iconImage_.ready();\n }\n}\n\nexport default Icon;\n","/**\n * @module ol/style/Stroke\n */\n\n/**\n * @typedef {Object} Options\n * @property {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} [color] A color, gradient or pattern.\n * See {@link module:ol/color~Color} and {@link module:ol/colorlike~ColorLike} for possible formats.\n * Default null; if null, the Canvas/renderer default black will be used.\n * @property {CanvasLineCap} [lineCap='round'] Line cap style: `butt`, `round`, or `square`.\n * @property {CanvasLineJoin} [lineJoin='round'] Line join style: `bevel`, `round`, or `miter`.\n * @property {Array} [lineDash] Line dash pattern. Default is `null` (no dash).\n * @property {number} [lineDashOffset=0] Line dash offset.\n * @property {number} [miterLimit=10] Miter limit.\n * @property {number} [offset] Line offset in pixels along the normal. A positive value offsets the line to the right,\n * relative to the direction of the line. Default is `undefined` (no offset).\n * @property {number} [width] Width.\n */\n\n/**\n * @classdesc\n * Set stroke style for vector features.\n * Note that the defaults given are the Canvas defaults, which will be used if\n * option is not defined. The `get` functions return whatever was entered in\n * the options; they will not return the default.\n * @api\n */\nclass Stroke {\n /**\n * @param {Options} [options] Options.\n */\n constructor(options) {\n options = options || {};\n\n /**\n * @private\n * @type {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike}\n */\n this.color_ = options.color !== undefined ? options.color : null;\n\n /**\n * @private\n * @type {CanvasLineCap|undefined}\n */\n this.lineCap_ = options.lineCap;\n\n /**\n * @private\n * @type {Array|null}\n */\n this.lineDash_ = options.lineDash !== undefined ? options.lineDash : null;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.lineDashOffset_ = options.lineDashOffset;\n\n /**\n * @private\n * @type {CanvasLineJoin|undefined}\n */\n this.lineJoin_ = options.lineJoin;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.miterLimit_ = options.miterLimit;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.offset_ = options.offset;\n\n /**\n * @private\n * @type {number|undefined}\n */\n this.width_ = options.width;\n }\n\n /**\n * Clones the style.\n * @return {Stroke} The cloned style.\n * @api\n */\n clone() {\n const color = this.getColor();\n return new Stroke({\n color: Array.isArray(color) ? color.slice() : color || undefined,\n lineCap: this.getLineCap(),\n lineDash: this.getLineDash() ? this.getLineDash().slice() : undefined,\n lineDashOffset: this.getLineDashOffset(),\n lineJoin: this.getLineJoin(),\n miterLimit: this.getMiterLimit(),\n offset: this.getOffset(),\n width: this.getWidth(),\n });\n }\n\n /**\n * Get the stroke color.\n * @return {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} Color.\n * @api\n */\n getColor() {\n return this.color_;\n }\n\n /**\n * Get the line cap type for the stroke.\n * @return {CanvasLineCap|undefined} Line cap.\n * @api\n */\n getLineCap() {\n return this.lineCap_;\n }\n\n /**\n * Get the line dash style for the stroke.\n * @return {Array|null} Line dash.\n * @api\n */\n getLineDash() {\n return this.lineDash_;\n }\n\n /**\n * Get the line dash offset for the stroke.\n * @return {number|undefined} Line dash offset.\n * @api\n */\n getLineDashOffset() {\n return this.lineDashOffset_;\n }\n\n /**\n * Get the line join type for the stroke.\n * @return {CanvasLineJoin|undefined} Line join.\n * @api\n */\n getLineJoin() {\n return this.lineJoin_;\n }\n\n /**\n * Get the miter limit for the stroke.\n * @return {number|undefined} Miter limit.\n * @api\n */\n getMiterLimit() {\n return this.miterLimit_;\n }\n\n /**\n * Get the line offset in pixels.\n * @return {number|undefined} Offset.\n * @api\n */\n getOffset() {\n return this.offset_;\n }\n\n /**\n * Get the stroke width.\n * @return {number|undefined} Width.\n * @api\n */\n getWidth() {\n return this.width_;\n }\n\n /**\n * Set the color.\n *\n * @param {import(\"../color.js\").Color|import(\"../colorlike.js\").ColorLike} color Color.\n * @api\n */\n setColor(color) {\n this.color_ = color;\n }\n\n /**\n * Set the line cap.\n *\n * @param {CanvasLineCap|undefined} lineCap Line cap.\n * @api\n */\n setLineCap(lineCap) {\n this.lineCap_ = lineCap;\n }\n\n /**\n * Set the line dash.\n *\n * @param {Array|null} lineDash Line dash.\n * @api\n */\n setLineDash(lineDash) {\n this.lineDash_ = lineDash;\n }\n\n /**\n * Set the line dash offset.\n *\n * @param {number|undefined} lineDashOffset Line dash offset.\n * @api\n */\n setLineDashOffset(lineDashOffset) {\n this.lineDashOffset_ = lineDashOffset;\n }\n\n /**\n * Set the line join.\n *\n * @param {CanvasLineJoin|undefined} lineJoin Line join.\n * @api\n */\n setLineJoin(lineJoin) {\n this.lineJoin_ = lineJoin;\n }\n\n /**\n * Set the miter limit.\n *\n * @param {number|undefined} miterLimit Miter limit.\n * @api\n */\n setMiterLimit(miterLimit) {\n this.miterLimit_ = miterLimit;\n }\n\n /**\n * Set the line offset in pixels.\n *\n * @param {number|undefined} offset Offset.\n * @api\n */\n setOffset(offset) {\n this.offset_ = offset;\n }\n\n /**\n * Set the width.\n *\n * @param {number|undefined} width Width.\n * @api\n */\n setWidth(width) {\n this.width_ = width;\n }\n}\n\nexport default Stroke;\n","/**\n * @module ol/style/Style\n */\n\nimport {assert} from '../asserts.js';\nimport CircleStyle from './Circle.js';\nimport Fill from './Fill.js';\nimport Stroke from './Stroke.js';\n\n/**\n * Defines how symbols and text are decluttered on layers ith `declutter` set to `true`\n * **declutter**: Overlapping symbols and text are decluttered.\n * **obstacle**: Symbols and text are rendered, but serve as obstacle for subsequent attempts\n * to place a symbol or text at the same location.\n * **none**: No decluttering is done.\n *\n * @typedef {\"declutter\"|\"obstacle\"|\"none\"} DeclutterMode\n */\n\n/**\n * A function that takes a {@link module:ol/Feature~Feature} and a `{number}`\n * representing the view's resolution. The function should return a\n * {@link module:ol/style/Style~Style} or an array of them. This way e.g. a\n * vector layer can be styled. If the function returns `undefined`, the\n * feature will not be rendered.\n *\n * @typedef {function(import(\"../Feature.js\").FeatureLike, number):(Style|Array