From 35e57bd04d6c6e51582144b7a7296a544b8b5db9 Mon Sep 17 00:00:00 2001 From: Jos Koetsier Date: Tue, 29 Sep 2026 12:01:30 +0100 Subject: [PATCH 1/2] These are no longer used. Removed in https://github.com/alphagov/govuk-developer-docs/commit/20da25c023f915ebc3f9e1cf977f4fa24a962104 --- source/manual/images/ci_infrastructure.gliffy | 1 - source/manual/images/ci_infrastructure.png | Bin 68371 -> 0 bytes 2 files changed, 1 deletion(-) delete mode 100644 source/manual/images/ci_infrastructure.gliffy delete mode 100644 source/manual/images/ci_infrastructure.png diff --git a/source/manual/images/ci_infrastructure.gliffy b/source/manual/images/ci_infrastructure.gliffy deleted file mode 100644 index 2248ba70bcf..00000000000 --- a/source/manual/images/ci_infrastructure.gliffy +++ /dev/null @@ -1 +0,0 @@ -{"contentType":"application/gliffy+json","version":"1.1","metadata":{"title":"untitled","revision":0,"exportBorder":false},"embeddedResources":{"index":0,"resources":[]},"stage":{"objects":[{"x":0.8478260869564735,"y":189,"rotation":0,"id":90,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":269,"height":24,"lockAspectRatio":false,"lockShape":false,"order":49,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

https://ci.integration.publishing.service.gov.uk

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":213,"y":274,"rotation":0,"id":87,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":47,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-3,6.2867965644035735],[50,6.2867965644035735],[50,-126],[278,-126]],"lockSegments":{"1":true}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":5,"px":1,"py":0.29289321881345237}}},"linkMap":[]},{"x":211,"y":296,"rotation":0,"id":85,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":46,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-1.0000000000000284,-3.2867965644035735],[44,-3.2867965644035735],[44,337]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":5,"px":0.9999999999999998,"py":0.7071067811865475}}},"linkMap":[]},{"x":210,"y":295,"rotation":0,"id":82,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":45,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-2.842170943040401e-14,-2.2867965644035735],[57,-2.2867965644035735],[57,306]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":5,"px":0.9999999999999998,"py":0.7071067811865475}}},"linkMap":[]},{"x":468,"y":285,"rotation":0,"id":77,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":42,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[1.6521739130433843,-39.04720420448922],[41.652173913043384,-39.04720420448922],[41.652173913043384,325],[-14,325]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":41,"px":0.9999999999999998,"py":0.7071067811865475}}},"linkMap":[]},{"x":266,"y":630,"rotation":0,"id":73,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":200,"height":12,"lockAspectRatio":false,"lockShape":false,"order":39,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

https://github.digital.cabinet-office.gov.uk/api/v3/

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":473,"y":289,"rotation":0,"id":72,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":38,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-3.3478260869566157,-43.04720420448922],[52.652173913043384,-43.04720420448922],[52.652173913043384,349],[-15,349]],"lockSegments":{"1":true}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":41,"px":0.9999999999999998,"py":0.7071067811865475}}},"linkMap":[]},{"x":470,"y":286,"rotation":0,"id":69,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":36,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-0.3478260869565588,-44.5],[31,-44.5],[31,-201]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":41,"px":1,"py":0.5}}},"linkMap":[]},{"x":374,"y":93,"rotation":0,"id":66,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":34,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-229,-4],[-229,64.75],[-239,64.75],[-239,133.5]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":2,"px":0.5,"py":0}}},"linkMap":[]},{"x":208,"y":284,"rotation":0,"id":61,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":30,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[1.9715044956099632,5.684341886080802e-14],[38.531727634754475,5.684341886080802e-14],[75.09195077389893,0],[111.65217391304344,0]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":5,"px":1,"py":0.5}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":43,"px":0,"py":0.5}}},"linkMap":[]},{"x":206,"y":95,"rotation":0,"id":35,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":13,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[24.695652173912947,-1],[24.695652173912947,65.25],[-71,65.25],[-71,131.5]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":27,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":2,"px":0.5,"py":0}}},"linkMap":[]},{"x":0,"y":61,"rotation":0,"id":24,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":96,"height":12,"lockAspectRatio":false,"lockShape":false,"order":10,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

GitHub.com

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":88,"y":45,"rotation":0,"id":21,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":9,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":true,"interpolationType":"linear","cornerRadius":10,"controlPath":[[-30,35],[-30,108.25],[47,108.25],[47,181.5]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":2,"px":0.5,"py":0}}},"linkMap":[]},{"x":90,"y":110,"rotation":0,"id":19,"uid":"com.gliffy.shape.network.network_v3.home.cloud","width":100,"height":70,"lockAspectRatio":false,"lockShape":false,"order":35,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.cloud.network_v3","strokeWidth":2,"strokeColor":"#000000","fillColor":"#ffffff","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[],"linkMap":[]},{"x":42,"y":190,"rotation":0,"id":12,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":7,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":false,"interpolationType":"linear","cornerRadius":null,"controlPath":[[0,0],[608,0]],"lockSegments":{}}},"children":null,"linkMap":[]},{"x":136,"y":261,"rotation":0,"id":7,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":6,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":1,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":false,"interpolationType":"linear","cornerRadius":null,"controlPath":[[-1,-4.5],[-1,10.5]],"lockSegments":{}}},"children":null,"constraints":{"constraints":[],"startConstraint":{"type":"StartPositionConstraint","StartPositionConstraint":{"nodeId":2,"px":0.5,"py":1}},"endConstraint":{"type":"EndPositionConstraint","EndPositionConstraint":{"nodeId":5,"px":0.5,"py":0}}},"linkMap":[]},{"x":60,"y":271.5,"rotation":0,"id":5,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":30,"lockAspectRatio":false,"lockShape":false,"order":4,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":6,"uid":null,"width":147.391304347826,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

[:::8080]\n

Jenkins

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":60,"y":226.5,"rotation":0,"id":2,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":30,"lockAspectRatio":false,"lockShape":false,"order":2,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":4,"uid":null,"width":147.391304347826,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

[0.0.0.0:443]\n

Nginx

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":42,"y":213,"rotation":0,"id":0,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","width":190,"height":172,"lockAspectRatio":false,"lockShape":false,"order":0,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#ffffff","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":9,"uid":null,"width":186,"height":150,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

ci-master-1.ci.infrastructure

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":319.65217391304344,"y":230.75,"rotation":0,"id":41,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":21.5,"lockAspectRatio":false,"lockShape":false,"order":18,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":42,"uid":null,"width":147.391304347826,"height":10,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

jenkins-agent

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":319.65217391304344,"y":269,"rotation":0,"id":43,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":30,"lockAspectRatio":false,"lockShape":false,"order":16,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":44,"uid":null,"width":147.391304347826,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

[0.0.0.0:22]\n

ssh

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":300,"y":221.5,"rotation":0,"id":45,"uid":"com.gliffy.shape.basic.basic_v1.default.rectangle","width":190,"height":330,"lockAspectRatio":false,"lockShape":false,"order":14,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.rectangle.basic_v1","strokeWidth":2,"strokeColor":"#000000","fillColor":"#ffffff","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":2,"y":0,"rotation":0,"id":46,"uid":null,"width":186,"height":310,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

\n

ci-agent-{1..5}.ci.infrastructure

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":319.6521739130435,"y":310,"rotation":0,"id":49,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":30,"lockAspectRatio":false,"lockShape":false,"order":20,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":50,"uid":null,"width":147.391304347826,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

[0.0.0.0:27017]\n

mongod

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":319.65217391304355,"y":340,"rotation":0,"id":51,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":30,"lockAspectRatio":false,"lockShape":false,"order":22,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":52,"uid":null,"width":147.391304347826,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

[0.0.0.0:3306]\n

mysqld

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":319.6521739130435,"y":370,"rotation":0,"id":53,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":30,"lockAspectRatio":false,"lockShape":false,"order":24,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":54,"uid":null,"width":147.391304347826,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

[0.0.0.0:6379]\n

Redis

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":319.65217391304355,"y":400,"rotation":0,"id":55,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":30,"lockAspectRatio":false,"lockShape":false,"order":26,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":56,"uid":null,"width":147.391304347826,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

[0.0.0.0:5432]\n

postgres

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":319.6521739130435,"y":455,"rotation":0,"id":59,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":30,"lockAspectRatio":false,"lockShape":false,"order":28,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":60,"uid":null,"width":147.391304347826,"height":20,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

[0.0.0.0:xxxx]\n

Elasticsearch

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":319.6521739130435,"y":490,"rotation":0,"id":63,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":30,"lockAspectRatio":false,"lockShape":false,"order":31,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":64,"uid":null,"width":147.391304347826,"height":30,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

openconnect: https://vpn.digital.cabinet-office.gov.uk/github

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":94,"y":61,"rotation":0,"id":65,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":96,"height":12,"lockAspectRatio":false,"lockShape":false,"order":33,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

GitHub Enterprise

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":232,"y":71,"rotation":0,"id":34,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":96,"height":12,"lockAspectRatio":false,"lockShape":false,"order":12,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

GOV.UK users

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":200.69565217391295,"y":34,"rotation":0,"id":27,"uid":"com.gliffy.shape.network.network_v3.home.laptop","width":60,"height":60,"lockAspectRatio":true,"lockShape":false,"order":11,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.laptop_3d.network_v3","strokeWidth":2,"strokeColor":"#000000","fillColor":"#ffffff","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[],"linkMap":[]},{"x":60,"y":310,"rotation":0,"id":75,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":30,"lockAspectRatio":false,"lockShape":false,"order":40,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":76,"uid":null,"width":147.391304347826,"height":30,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

openconnect: https://vpn.digital.cabinet-office.gov.uk/github

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]},{"x":279,"y":600,"rotation":0,"id":78,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":170,"height":15,"lockAspectRatio":false,"lockShape":false,"order":43,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

https://deploy.integration

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":41,"y":583,"rotation":0,"id":79,"uid":"com.gliffy.shape.basic.basic_v1.default.line","width":100,"height":100,"lockAspectRatio":false,"lockShape":false,"order":44,"graphic":{"type":"Line","Line":{"strokeWidth":1,"strokeColor":"#000000","fillColor":"none","dashStyle":"1.0,1.0","startArrow":0,"endArrow":0,"startArrowRotation":"auto","endArrowRotation":"auto","ortho":false,"interpolationType":"linear","cornerRadius":null,"controlPath":[[0,0],[608,0]],"lockSegments":{}}},"children":null,"linkMap":[]},{"x":570,"y":198.5,"rotation":0,"id":15,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":90,"height":12,"lockAspectRatio":false,"lockShape":false,"order":8,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

VCloud ci DC

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":405,"y":61,"rotation":0,"id":70,"uid":"com.gliffy.shape.basic.basic_v1.default.text","width":207,"height":12,"lockAspectRatio":false,"lockShape":false,"order":37,"graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

https://api.github.com

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null,"linkMap":[]},{"x":450,"y":110,"rotation":0,"id":68,"uid":"com.gliffy.shape.network.network_v3.home.cloud","width":100,"height":70,"lockAspectRatio":false,"lockShape":false,"order":48,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.cloud.network_v3","strokeWidth":2,"strokeColor":"#000000","fillColor":"#ffffff","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[],"linkMap":[]},{"x":319.65217391304344,"y":430,"rotation":0,"id":94,"uid":"com.gliffy.shape.basic.basic_v1.default.round_rectangle","width":150,"height":25,"lockAspectRatio":false,"lockShape":false,"order":51,"graphic":{"type":"Shape","Shape":{"tid":"com.gliffy.stencil.round_rectangle.basic_v1","strokeWidth":1,"strokeColor":"#333333","fillColor":"#FFFFFF","gradient":false,"dropShadow":false,"state":0,"shadowX":0,"shadowY":0,"opacity":1}},"children":[{"x":1.304347826086956,"y":0,"rotation":0,"id":95,"uid":null,"width":147.391304347826,"height":10,"lockAspectRatio":false,"lockShape":false,"order":"auto","graphic":{"type":"Text","Text":{"tid":null,"valign":"middle","overflow":"none","vposition":"none","hposition":"none","html":"

docker

","paddingLeft":2,"paddingRight":2,"paddingBottom":2,"paddingTop":2}},"children":null}],"linkMap":[]}],"background":"#FFFFFF","width":658,"height":642,"maxWidth":5000,"maxHeight":5000,"nodeIndex":96,"autoFit":true,"exportBorder":false,"gridOn":true,"snapToGrid":true,"drawingGuidesOn":true,"pageBreaksOn":false,"printGridOn":false,"printPaper":"LETTER","printShrinkToFit":false,"printPortrait":true,"shapeStyles":{"com.gliffy.shape.basic.basic_v1.default":{"fill":"none","stroke":"#666666","strokeWidth":2},"com.gliffy.shape.network.network_v3.home":{"fill":"#ffffff"}},"lineStyles":{"global":{"strokeWidth":1,"dashStyle":"1.0,1.0","endArrow":1}},"textStyles":{},"themeData":null}} diff --git a/source/manual/images/ci_infrastructure.png b/source/manual/images/ci_infrastructure.png deleted file mode 100644 index cfb0bba5575c991b6bf609d87dc71f4690adde02..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 68371 zcmeFY6+XcejL;NOy^JgGejsMJg%Xf*^{3bV+x2E8WUPcXvwnUYFkYex7&l z|6u?22R;Djxz1TLvu0);bIeB#HF<0d3Jf?nIBZ3QXIgM@2)W=V4h;qTB^loEDI6Rf zoZ>TSo%betsi?73UE?9?*}B67(Qxnx&j^G!Q>yx=kb=-rf)ts}DGBWYuT+PByee1h zCVL`G{)E|F1?6=mQonG|gZHEHLU%W-I_pNS+`O9!VXqfS`=zCgy4tQcts3?lBk7Wh zI>G*UcnC65XlU^CbV$Kck@#;I%?wuYf31f6?|)DsFytno{ojwl{#76))yYTPk@5WB zoBw$_EWrln|M){T0z5uc2P=qz9_fF7%B)ZreC~ff5ru*DOhuaq%O?1Li{l?wu<<|7 zz~p<3hsUGZ^&}tv|BwX;hxmW|;r|!z|1+ASvqV!NlU!(YJ#@gv#%8lkOk(_x1)7aAjIVF?o_TLt@xvaj~0 zDg<8tWJ(rjN_E|R(j($}VCQplUV}p|Vo_SQ6ZIbt43GiK^Rom?h2xP)*d<`oE>7eQ z+LWtdJC~SFCQkfvOVd{OIy*?sj4NdOuk)?QgG1q~qML=6j~3u@vN1hr>SMX6wrA$N zQDa}6<-VyuQ3U1Kbe<_QmCVa5{O?KWWdP?(pGx)_4h_y2jE0QNYA>RC=Hc>J{KH`MNQ?DM0W-&w16veNc%Cc6vrj2qobb|s3A z|0`J_*uRYgT0kt_(Z1l~)CD1BiXTK7IUNeVpdWvZ8JIi|s{=L?ILli2(?5m}8w!3Irki(brZ}kiZd_10#+3(sNRl)6Bzq9N+r^q?4<7>wj ze~xJ}ZRow#iL(m3W`J3`7ZnI{MP_~WbRF$gH?73?AGt%H-LML@lykf@#>HS^%OCFz zK0Lm*DjvOtIa0IV_9S8BO!JjJL*4U&90u8ZjQ@P|Im`#p-iyCLdyjO)O)X(ojGaCv z<_95)1-rrUY}ES~1#JTS!yud*le{5PaPYUvZIrwn-D>QqZPi-sXrCFJz%CxkXS#!KFkkEZEMTtIl(aMo9GdgD&xhkC$Hi7PX%kwq$pS@aW_V{4B zeM-)2wD9X-zHxeuP1|lTI8ngUMm|}vO?A9!=v~gd$e3UiSF^F!w&K?zj>+*-b1uk4;i`#s-O?~Loh)=S z!X^Bx=>Q!DI9Toq)w!o1jX_OXJf~v|wCzX7gn=L|$-LYiXVu^L zy$u^Tb@CQ)4BV!RrAmGOg%T-h#waqLR8jZRp#+`|5x2cJ*x2K`0Xy%-%xtf#AyB*f z+bgw5?E(pe1v^RK+skNNT49@5)fA!Mo?I$6ej_axFCXsj>_^0XUscVXE6rVu-Na|k z;E+AZxTf3w2o5`+tba|Day-|8vx%L@yD^%=kI^hhW-Ph9*2C3BrH%c=Vkd*oskj@r z7(`b;@fI65xz(Nwi_SJ|rr9RjRerp?JM^ogy+Moc}{6>k?#FRF)N)i+pVN# zqH@y2t0eny);itCO7d=7eIL9A)nCN?eLv!NZyrkHneTJ@TmFDBY`AJf!q&F9;)Boa zaZl}{@6GhhVVk3DC=R~~%?m?&e$nmh7`wA^y}GO~5{>T$4;nUUZVs9b_r|oGETqy>sb85o#VxofT5%PZgJg5ZFTD*`(%Z96qn@J#xoEIcM^r*M0dpRZ0Dud1|Xt}I92t~ zcuoC4rQPdgGewZ-Nw-h7udVQVxLG{E+DxC_NOm+4;IZVnoF4JD8j*Zxu7SifZ}aYJ zqi42`DzTGeb^@&&Jh|$TykG7WCCf6wrIncbfJJUrx8PaCnA1!rg*K^goyv^aZ+icS zl#<8nSw!b)J0fm1(ElvwuqLL(btj>Ev8@>fen^yziZU@8Tc^v$AbIUdIJ@xEe(O{b zSC_VUQwI;P&9=iS!A0NQ*fB(0q4pUUgE{6QJ6f-|M377c(wft!0}5Y1iUhd&G2eHUXuMBXvRcosWcYPEnW@$ccyZtjT0aATs;n|Jd z7aDPc7RS+SMY)R*r%Cs7ERJWA4_70GKDk_Y2)c~9KqC)!RYL+*xRSTONDS>Nx;K4+ zgPixXmrY5dQd`6uIemn=o7-lp`%F%}iH$tfyI{s*Lx+YO>Ec^b$oby1T9+(O>XX-j z#%|M=Zu>QpB9^Ctm|Sm_*f(&($Q%=l+!s7Hr^|fL*z*QaFe5OOmPt*$mwQLLNKN9Bqk=Vr3)-crxRBPZ4SPhTlD zguf_5B=Zvq7gpW8Te5cHkJBXEQl3&nkM(cVC=cKu&0B|b^5rMUNZ<;u;mKQsVpCeR z-OL~EHSU%=2VV>cE>>SGc$Iy8O4&(+oO;}Hy;Eer=yTzUNjhTaI<7l!_F1WEBgwW= zBtK$AKf$r}%1UoD2v=fjLuY0n_;{7Nj|0o$&;GfU7aHW@9+3*&QdX8{U-Ff|b_IPN zqx@&5^eVQN^J`la-(-i%kM_-daRP3h-oomN`RZmq8&5l7@iAZnO-g0b&{4eZ{O+vG z&y{=lV$rXy1)RlNaMY*&3~(RbAC^2X&if*HUq72SEV9c{_d)z*kk=vdW>fNEdu&8A z>v;qJ*Ot)Ta+1u}%&5u(hNE)5O4`ai>C3>2YXOed%a!4$eeRcFsXAbou7k#1E^GMX z8;)H_`6a*myz8W^PbThd(^xB2Ten&j7OEv&cXX1UT87s+E-tWT&o{a{$6QuJ)v9vh4Ek|I_nutj(1?3h zGbVU@Xlk?Jk%ci8va+nbrM0qA$SXr6#JG@F($lvjzIY_G9874J?sE>IV%xELm!X=# zpU`V)U-NCbN7kqLSWEJ(JinYw>Qg?UvyjC%uL8eNYPYxh>zJvv2w$f?cT1=}E-;uQ z5Rr3Yoqy?Dh<)aG7KDoHW+Pyc`cPGV_2+!nQ8XTN@F|TW3CcpJz7E|Dp7zd%;x-Tu z)jZY@e{4CJFpwdd$kbcS+Sj=v#l~Z!J>}-$aAMu~B7UCWbG@DCfd3((^=!h>p|t!> zl~7Iv-dM0wIQPqnKoJp}HHDjvSx38*Ap!UJ=Bo+AVHZi~ZmeV>NG4+v%pmmfZ~|r1N$}oazIg_=*as$g>yf!hx|_3QeHkzq>wDW~{b}!OIs$ zNK2?>d37fGaC<_1Y(CUEHq;1c?Ybz$pKgbyA7p1>n zL9ZJrcQ|N!xIYKye*xd*8GbNDv4JvIL$-6)b8gHtpB4H*#P48olcxR!af5Z|Av2T#xe!zN7D|r(b*sGH*wf zxf{;#er%2FnY#KMhgcuBTr4xHQS=L@@`YIvf_-O`nhPsjD2e-Z%(Ovqs4(FgwaeVaJN2t${4IGdSq2&(n7@ z(fe!-I}&|R+`RkKyKoj$3^b*vgg?T;1XcW|Zx=={1Fs2~wB`mVX-sVtm}BN{_)Oj} zho}XtbB_6KUz+U!Z!E=*vLzuiBEI~YQ%jyFWpP_;lY=y5)g-B0;`SuOudzZO(nV}vH-BD@Ue!2VJ^c-pnCrJs zqpMBAt^(WIe*(;VZ3%8@vFx676zjQ=$)Ntg_35^`-!(LyVp98@MS*4a`vtii+>e#+ z#vYT7d+mIyKW6=&pC}^WIu;OxLt>!@Gv!kgF4500;Qe=y+beF1_>pkXqNQ4qjB4u zlvzD(@7(j!zb@h0C&<@q{Pa#rHH5Az9+|VSzb&Q3(V@6=Ecs86w2IURE!0Fz0`1n= z-uq@B4_c^Ju6G!lsZ3dlbl6KO4V9o^Vza?)pRMnq6vP7HA7+Q47{}6zYeQJhp)9%i zzIc;#JUQY&Hc7lNRiUwPqzcC0PlWrKZ1^14e;}i2qp$vC_#j-MbEI9q`00^jA;+(f z&e+D6{`&c1JnQx;$S9RmOu5a9RjhY^;@ey%GmA$hcKm-;z|Ftyz&<~lG|f9GNnpBS zz0MgtKSh;MlHPvC*_G}h^>D97>~nCnY1d?5XUmjLE$Zg9aRcIXqnC!tm1L_WA__-+ zo^pJt+N1Zo`*lXC`PA&i%`dtNa^iNyyTq06b0F6!MVt`Xj3<|UZ3$Vym8F%AQlIE@ zeZ{d$Cn|t81Lm8MLh&93)X1zVE%(u|MCuG6+p*u<4SP!DZ-U-~H>_y4$!}g9^^nGOB_1C|@H(T>TIzf> zh<_ri7-atp9T`<#fko9NoE6!1sibb9I!)Y5SQ(*{P-|ygyL6d%O#2{@W<$j4J_m)% zvaIcUsR)j^Pyinul-HZ#FYgsGx69N-^a_^fg&cM-xj)P;1xMQ_FB z@P4?bwCqL-F1)?LD`dVQuz7@p4HaCAaitU#DwX4x3tnDNJ&SQoJ&WJf(870l8?u^1 zqkRva-HQ0+BgIkG9==Qv>&9&6B9yx;*^$Nku;R&5yC*SPi)XR@- z8m}qZ7dK9!>W99f~hUK!|lwlSdj*qBIysX6sn?iJ&Ogt*;=`uy8(U8%rF1;-qwFh!2lLN|1+PPU6^|duEcUpMYu@F^ zE7=%S;8n7E5K2r*U!sZ0B%WhDsh8d1sgmuc|C*5NjgBH&ae3+TC}B#UNF#@w5RI9c z1cMum=P6RMY4$vYwQFLdN8pe8(Mf&Qn@5*w`L{ z<#^7TvrgizLLZx-Nkn^!RA6y0aWPjl+%|TTEMr2NQ1d~AVSqp3(DeRdAo5C$MJ>g` z>V#d5a~uFmyYn7#XIsRx z%a9ay)j9_?tk+*wc#Tj3w@;pAnbR)|7jLrWp}|E-Oc=IJFcL`J(zW`g%YFLpYjW<< zaADsb*v*Siapc2U%l)e2_$JjI+k7#j3=Lh3bdn<&@fkRVUhD@hMCa7!>Sn6mlp68q zV}H1eju3pOI)04w$Yo#39E(3WrEI#^Ex29@NH^=R774mJUx#&w4Bs?2$R4~Ge*Ny)S32jwlIKL) zxrPR_*Il_a`}Iud4*E0`Tz`zNx(t00Yqmr@+rx9q9HgKuy0Q_8hZOtrh3jEmf7SgC zT*2h9nYv@!cEDQK! zOcMlr8kLx5M|vzL)mg2z=3@E=NkfU}_p3N7&Eg&cW(-NYHjQU&)S|9VxjwXCzo4g& zY2|;vr3?YUfQ-yL=uvCl+%C{;`Tne+5Hv}BurUubTHy zd16vb6B5=0lD_4L2y6+{g!?d|bL2naxPq;A3sj0GvV*QaUUj@`rz@pTU}{kp*zXAr zOAZ?`CnMoCW?Cymfs$c@{eQPX;N(SD>}dL1gQ@94~M+AGn6 z>X-pLX%y6%XM9h5doN2hF@o@q2mZIHeoaeY%$$>yukHo*Ri@ML4a zIw9Dh6x!Tq89Hxgv=b1HDfvCCPfBv|F30oS9pyEA5PZ=dBlC(EvNC%eMl=pS4NB=t zl{u9Nj%B(_AtGj~j2f2?igUF%>1Qu}>)T@7;#ZL_O`Y?;ztvBq2+_`G$aT{O!ZnKn!wAHzoUT?&e{)GlDu)%hU zBlEAd`H?hK<-bsjD^Ns;lR16t-};!-hSF9_jDqWcg%$kCsbs`8{8}*}14S{PCGRqG zg#!L-NQ%rY>&1e5nX&7-E|+MRfo z1xvRzOoXv{*l2PqYRZO_dcSx_%E}>q;&)_G2h8!c2VYWGEw;lnvG#kvjEXS)@Fv~H z1%WchGLi0#^u5vT8(5?QKq}ol08(?kyvG_vq%&T=CED;pz&2oy5_iHo-&&Z**Xd;o zXIq1!iff`uya<_uq1xF;l=zUoVe|Ci0c2T-QF7? z<{7b_-ux+>2$4Imb}NP@cMO-r=u2S#GI^BVb=H57-)#_S_*%@f;>PI_LVjo-5EVPN z)u0nHS5Hy)Zj0EK&F43Io)N8&C13gYYRkWne81>^%clIZP8LzScsXgt>N^Q=%lGBUdzY#t#hP)n<` zwnrJ=T3iXTl!{+(WqtN0h*ZImM|-sMW*NWrvOM}%G9rmW{XXUhn_Hz}g?78pDT1V~ zj+R==aSxp~i}cI1gy>IHW_#)b0kO{4WZ5tNg8+|4NO6U21HA1pmi4o@Ha^0*RK^n_ z4DE;V<&KEwCt1%|48zHr$}<9G6zKD#bTJ;z`!0Pf+5{hNZiI!`^RvD<6yx}5>pXXy z2-R_V9HCB%eAQVN>(6F-IlKpMl3Wyvd7ppsNqS$t&CAsis)>wg^!^b~^zecpBr6UD zDkmK!JcR5-rXq*@n-j=g0OW?CWcERLh;Cm&Sbi9-xjf^+ndsxcOm=Fdl&E|BuVoWu zg5)Hv0>x}Ih?7GSs_9CV!kY zV&rOq<^2`j6RcevKznl4lP8#jFe-yRrwG1toHNC0r@u{ayD?W*uEF^Efz~Ry)?W7O z;!z9q+doO^kfLD=@sV%o6yd!ghu0#Bq!k=amH%QEs-=YF$FEej(2|-I*5I|&9-tJX zgZ=9a>t6>T>=Up{0THzKro0$Y2^J1@ygW*X+!X{YF z3;SAtrxf^9H4Tc4{h$N_4Aef9_jbIyITO66K3~g!(z_%%Q|D;9JJHe3*|s;J{P{b}iqtEo z(kL(yz&k9|@mc(Q%Fa!vrC$uTmX->yZK z%gO9Ijg7yd$CE@b;cPkXrZirslAs^w^G(q;cg5>P<|)C6z48uM@T-0&FHSA!o5GkA zab`Ry;=Z%?d6Y@oyF%uzcH8}(;ov-ZiCm*0Ou4e{MLErTZU=MIo~K*%cudZC7W>yW?Tky~qp+SpH=9#-!Kw>iL2eS` zSvW8-qyK}v-bM{ zl&+8tLYY=%No5+>(az?=hpAxTYeCHOh||eFse(k{Ko&Rw83vwxkK(7gDIM)DOWFVe z>$Z_-t;9bx7q*!t3$)Ilew8q&zq2l~TWnsp=-X7%az3NK69?;cN~xe>Q3?!})~{eR zZRaNMg)x3EkKk(TrSaUNrxbC?XUzGF1gipc(zFS*RV)KOqPy$H{557@N5UdY*y*PG z-ncVxf18N*e9f#qfE-oc-`&hc(aX+#bYjh|hkw2C06GfxLD&Ksm3K2ZF=-~uFkfI$ zw;aYWHgQJEPMGjU8-t_Q&_j#r>tN3%HF_&;Tw@$bj35mQ82oE}^mL=?RJDcrutSbV z5^#00DX6K^v5>bLEHwjj3t|tY*=lVs16iqXh%MUoAy5kvew10^RTMF7g{r47A$y?; zeiZU@_5>h%Iie}>49$jF*R}l>V>-26e?O53TKu{A`Vlz!V3DWwg%dlB;6NGpygWI1 z_VxbuQ;p|ipe|3aY|=u7=0LyfUmq%HR{UOM`^BFKI`bvKfDUN~9iA=sjL*QvRvB$A zFu?|cDb!!V&uOaA>Tl=oCD`l-Ii<-Q>VIBPtu9+rh6i3rA_OwW27z^)evQ^Zp2MQg z5TeGRJ>hoQ1-{M==%n@{AZV#nJqh1IgsmJd2C1B+1b^AJ?;JCs*D!>sk;G42TmrV^ z)gWblVg|a=GU2}*n0#^Ypsgf|jkMUmce{A?b(GKWqRb4$i_e(oqmaSdR2DxAhf4y4CY zQoGK`8QXC>uvL?G@D(7d8^fu#ge+>673MuN*?rotGBie>|Its0il&HymHX*7ErjW1vs|FJg7572d6C7EU80UFFr(y9qe_2s1Fggj0ah-(6x}w z*c(c5E0wIoRsyXV5q)DRoA{UB{w39;;S;}p;mJdFL;qG+Q1IgL=~1CGJj|9k3AJLI z)+1^5rhX?Ss_7Cw0R%ff@(~FK0|MLJF7Pj3P2eV6Z;sS`_~2Fx0PdHE3oU0k98yx@ z1-US06J5rc{t0k-;4>Tc8Ux#hV-V=xtmB92lm;Z;E)^w2-`o)9yQQiZhOS|p4QmAJ ze1?-4u+I9^Fa8sogSZtUFOgu*%9h);dH;!=cOO9N@3N~kf7@k7b7=^(^K93xSv42%7peMa6RQRfIC+ zbZI~PrbMkP##&gQxF~;9cF?;WO~Li|td!#ax=z_$9`V_9hABZHb@OCnsEWJodZyP; zZ!VqBD#jPnHy2Z3TSnLI-h0*}CbC%m;-KNdOo?acjtCDUCwl=ZTOi6K#@UY|u2ettJ^GcaWP1i>>K=3p5@2nOk- zdxQq*XV{7qz_?IP4HX`!dYV|y*C>)lIhYc5YA-MqAiu^I3(VzrCmngLS3>uE@2}!j z6(EGsWI>8;+aERP6(Hy__Y_5&Hzh{lkWuCI9a4m4V6!o{4r9&R7MdG*wm%yhZ|pvoUsh+PWx(XwHp-|Jk@Goo zAJjlqu9NyrNgWy1f2l7?^ciOj4eh|8O=Fp0xlpyr%)sV1=Hpz;#M9Io%Yed01!Ma( zoI;(2(Lc8;hJxGi$s=QRE#HlU?AzuA6o>D0CONzK#yhgQ*OA~$M!K|b)_r`2`%cUB z1%Z#*esEyNWyXX2S?haLW{@F6a=~j)f!y}1c`;D2tw5=fwNNs@|Amaws#qr9mbFro zz`Toj&S$0FHQlCQscx`yqmcse(y?1*h0=N7TiRm0TiL@wc#(%kXfLv8FGCb?Ie6KY)qO)7oD$~aR3+>EZL{37! zx51Uq`L%s>RiC0%AM{jj(fON2EC=4u7X-zd4x?~Zxl|z{_alhNkt*}3{(hCu)*uZ+ z!IP|riOo5c+gMjVAem}HR_veWCTax@>5#9@IYU{;q>adYCz6pH);m7t$@v|n;t^xe z=iYX$*!q^1l$HID*V~J1{}P&TfN1w{@$VHN%Z(+#7ptGZf@`iK5B9DOEmgDKRpN)R zQO8HDg+y#;>D;w1O%458TuW?!yeod)iU(y*VqbtCZ+a2{gJ!u=q&4ayPN4o1GY-_?R_;?l=LuDFHzt6%QqYh9^OlGe)Qx|_;3 z6l59jZVUD;H-ban`u#`kOr=C0xVY5E35_!%{bbBI6DGSH^PcB&4R%?W*gWD@(t8mI zbB;&tOs*q#h?SrwfJI`Cp-sob|UyW#b?tJ>j%67~=tFf69JkJ7|QwaMfrmg<#`+as9A_39CvZO@wWOF}j7 zv*Fh(6{K`>uGKtYwF->Vku2s> znd-SyP(XGCAQlRXhG?x>?_99oml9A0F1V6)&XVU6(C(P3jgdOU^Tj%XsUqJmM9@On zQdA81P*5?~J0JtHj!9i#B3OsHY<3qb@#TQ(bXZ z*o?96PL`QIzEy#YfLxy9CH?3Txg^v~{&Sp2c=b<4CFONq`)FtWqYn$09>;a(acY!o z-$q;xY4_;6s-qQ2>q8F-)@vqBs=&`|n%9BwERbY>+B$vQaam*X;hNvkWQUy)5@p}d#@Xg()q_8Wa-P0tQXq>VeP7#Jt%%-E2xger@|#eUC_PEO|ugWsqe^Qg z3?}Lv7n5q`a7htrU`0KE27X=T@-|CMn$c{4%`oI*aqNtM%e94ds%so4=&}}&?>aF` z7lDLof&W+me>@gVz%{`%cB-|3(dReQjqVZeyv1sy-BPr2uGOHSP48TTa|x*H_#N37 zV^%+l4#(+RB_`F$VdEjxfVgoI=-N!q7RiH?kv6euFx1g3Cg|Q78?cUj37Ckr@g|;q zspUZg!Rq+WG5{Bx%OGt`Yy5JE{2+p}Ho=RgFBLM2U^)~RajSw@P#DexH%E`!*e3EiYqHiL@d5#x2ac*9d1f-DzZ^G0Ak$!FIimI zX%5(U$4k6|(lZa~H0Y>r?zBnznYaQ?fDs{dZMozYJ->#-zd46gTf^{#7n?M4QLMM1 zdb`zSC%?N|wM#ANaoD-(D{O=MeBwUg#thRO)#u=f!08#oy^4P-0XA-*In_2ghdn{c25E;??JgoA0e9Gs&&$!W{)8PcPdR6TMoOW zEw$hZp2aX%lHuo%{{A? zuwBt31QFig>{VFDC)sIA1&4J)@HTslcp-d0y;iKx7tiKd__qIsIDF zxKqgg0JvM}(-`cH zDT+8lVL|J_cJkM7oS~b(p+^q!d{iWj_{^}-DwgQQobx_lUMh4Q8alR&f0np@)AVqE zvk%a+x4$ov9U38=c?m?&vF~LlWvA^j*tO{Lw$Fl(aGoV z%)HcbrBku{I5tPg^G_m|C-3?1d(1g3gZpNPhR)@fW{cNZ<#4KqA>dL|vFUy!g}+MZ zj>xkaU2j7|pw3~2CmtwYB_@H$S~%fY(Pd;6IPJXga#Jn!@iVQuZ~sNCJiuie z)Je_5cT6{&W=TwqJY(Ws=Tx8;aEjpP$M$#nRGpo^y@H4`1yB_G;XPy)C1JTLP!UAQ z$1-nQ&y*U^Hug(Xbbx*X23u|cIR-yd7cBp#Q~hR3dv0R@56-gdlSc+hij`7iXJ5Z| z>5L*5WYy;?Zw^m1xpTXZZEyWHr$jGsSL0?XjF8|?t8; zAL^FZi8xgC*(FcjUx|>X?(u7fL(aQ(#Fb!|j=tALNhhITQY7`0a5ka*jn-OqY&zR~ zhxg)l*-$I-b=8NPL;2vR+k%=J$yeoEI!dxWtqN?M#6)tQUn2#K7AYtwb}U>fCso*T zrzy41ScO5fWC<;?8K#A4S70M2Q!3&rF*C|-cVTFzPUJHGwG|sr-hpLu5ushS>F1!EkJCfSD+aG3eFiSb;iFRp+VZwQ%G#~vX!GxG1pv9w|Kg=<-h&m#kOp8oF8$Ko}HZzXUB4DEq`1C11R@< zq&V{(!Nw*pE(^|Tz~oD{+f?2`AFtJ5IX(dKnj4%W3iCLx5}zwlk2g4zf}5Sv1i%Q# zUPn)&DDn*L_7*KdV91ey{PX>AN+3)qh65*gAunLora(6D z`r1WoQ(8UY$&dHS>8nIzPGiukiSItByVF&nXSBZ-MM(PcC@KmX#o@s!%y5N;L zsKW3Xx|XW2ITN}+@aiCj(f%%TQd zR9)XJE~GvUX-ML)QNSr?3_?8*J1QIVh@|`F5S#@7A;iu0m_+8{=XAJG+{kL`5Nw*rZvXiM8K=rs^wPr$i| zKg9=65C+uTvwt%)crYi+LDf>p%Ehbzyt}ZZDo%$Ggw?DtvLgNFy!BaNV&oUF>XGq zUc<|$H1oW_+MIRtJ)wji?ktr9j_{0$*S@8x_i@PEk>zGlz-iwHLmU;-8fPug#w^!5 zkzEI(lo9a@qt(s5s*&0Ot|pbmS*p@m%?)+sU2i9%>i0vgvMM8@hhk9mvnMYd8rJOq z1F{y7x-l=PhFcgv3;m?agH4QdONOqN)zo_0+8e!0cbkD6SUSN5Yrq|F$E)bj-p(1E z=^3;w4>|m(FOXK258f&#;`ci~cl30$(7*0AOstLl3T);J#PwKh7P@AhREw|a6)ZJ? z*4v}Q%fya07Re^b?mww42~0Df@Cd5LmfN>fXb>W$1zc4XLx0@R9_Xkj@_nk9dN?E% zOGjo1p!#^_g)h*UfcwF4PL%=y(hLR%_RBkPsz4x~29phr_nxCKpK-#X+cgblMjpSO8+E}iptX#diTvj6m-R$23VmfvA4}ug#n1zd8-XHos zR1xbL{a*0g8%H6A%-2w#^J!~-%9wl~Zd7x&T+QDTcQP4`KqVzy3!Vl} zXgVq?cgz>-@umjxT*gV&ct0^9uLNtFxvuQmN!j>YPi#6jpw)EmSCnJdw?DA~UqT3Bn|7+2U2 z2xkWv1XaJY`QvcY zVe4$zqr1FR*0Iw&ps8|j37l%l*C1Uzs%yI&ikug}m|N{;9enwVcIWiVkGuA+;idv3Yu513J#LMAnOr7n3_o$U3h>++BL5n|rF`(n#924fdrgPa~eW&jgt zz$PIT7FLm<0iOc%gl)$iC|G^dp!ZJ==#)^^`RCZvfv+kxWi((zM#xeu&U*!I%=%kTvWpaLshd zE`2#m-!096!`1*iVtxQ&4gJsFmvULxjR&JubSC>wNL?iJYJ8e>Kj2a%J4fU5@S{!v$5 z`c>VuRq}MAb=tN`7~MB8zGExkcG_niR5+}Rz8{hT8`pGLI1YT)M0d8(f{<>dz;u!z z+DEK-F0|7Apy@#O+U_U{F>LYa z00$I_vKJeJO$qlblji#y85}xXyf)`y;U45?6;~Jgvy;BZ5vKLE%O-eCHeCYthmHn? zlGR_#Md-gq(Fk0=TkURWgy34BGpLEPdP{4e^Bf@so@caXj>&wY;|!U?rj=;^iiAxq zGWPWq8vPnt4fYD!v8)HybwA21&1u29a~k@`P3I?+qHe{M?B(oCxhYK%qnP+vsh`j< z%BqG%hSDgRa`lW|zrEw$4>J1R9T>@?O2Zh&&JCCLiG;D?lKbXfN`?LaPo+Dy0gq|S zHxtG%dHrnJU<30cb8Jfbli$^VsfZI+E9;?S^YMqK!*6;f@6u1Sx{UH1)K$m{O)_uY z;rK}>3BsN(!f&v0TMU|;xCL@!`1%qhb8|-W7rv=*JDz*e8B0orF@ZI+f5>j+4-&bJ z;)HXElqD?FVAU-dzx2cBn=);=q1t6aK$7Xul&7|At~Mu^+siz18u45NC4YBIVU(@T zOr_IY+56`OyFT9X<zC@Sg6UOz@HOdxd1`2Crc(E#QKP}Mk zgT*pjP(Btc4hBj6=|;uF5>ujXCqiLHzEkE&N2I`D>l9Q_fxkK#k#z5WyjG!QW-vvo z?w}#ADe7VSv$MZS(_8#1_ziTEj^_;iS(?y3VBCGySc!upf9(B&o(DUc4vomhM!B>4 zXkhsxTQ;IufBYxzc))BNv2H!cFza`29tdWcdu8xRMN4os%qEgNT?;EziyI{*KqoCh zW{b(;C{+Ccm6D*9L&ktFDP&U!}CAev-lUH=7GZ^$0 zR5bPIGx6S#JSIBsA~75UpxRdN9ssAOFYnGftEar#iUoxxJ}FkXU4>)bz5jvb9jL_T z>W{lf8Rk{N&{aL7T#?3tlt~W|3<_W0bTe*TgJl?_sP0207o$Y^y&3ukJvt5}=OO;j zC$GMr1x&od*XFRV533=`*!MDd{G#I!vzih<+y{G??S|k6Q_LRBzd29nopW+zznoY? zec4v=Qm=|hM&-Q)E9St-pM?x1eVnSqeZJ}1*d^hKf!FLZ+7a}GJB=eq_0esOn{qhE(WHL+| zYMLQDJSQh0?UU-NKt#=#?raN^x$zx+>lv3M;OMjVy~$fB5qwK7=}?HZi3Gg8xtsQ$ zUetl9tE14jyfl{wPjOh6y56$JC&)Z~=O}f&uG~eHp~}H9NKS%!>q;N`s{f3&hP5`q z@U5JbF*lXy9K6N?rm4yMuYpL~>3W4=AnXe|nT*Ib3%A13r>nHhlaP%ou@h9uOKEdT zaz`Uc){v8&oC*`~?O&G|_h|nw#@;e4t2OEx1q3PSlJ4#f>F!2C1OWl*R_X5U2c)|M z5l}z@L0SQ&OS-!|&b{1wzvuhTIoI`_fBwMrtaay{V~#N;DeDB^S(71uus^oH!p`a?kMh<%2xCU@R5A7yO?0LVG(iguTtvq}|O_Tty zh7w^B~T=MCdjD?~|hD=RzQ+`ef zPVtT^F1OwM1{bfPviV;5G=meP1f_Qalmg!sUoJKIaDRJ0*{9Lo7T%tEci4el>Lx^& z@Uxf)}Dz^fbK^>nu@#}uZebP^Qf)~w^ZrRyoe+y%of3t?Iv0*U?4O%x>qfngQA!{ z%;wgOs=`ID!JY2bT7bf}imNjnY@P|2gSJtUZ#4-Zjk8tc<#NW;hVsz9j%Vne3cgar zC2d_Oui1?vi4ofL_AREhNr%0TbTspeZZA3xLOHDBs*$?Qax=~@0kdL9aZ7|c0TU$e z-Mp9yeEUvHv1RE7w#;QP1O67~Ts!XX%Y!|0`xXRf%hU$@=)tk*79v5Nqj*}fbk%l1 zu;4(i`E^uEuuJvQAZwAStf)w~(~|mCe<{Z-?IOB?OQj*Mj;e|W0-Rc}vW>J;om%YwSZhWajbA$c6USbfs(Q8DSf*WkX5#qys0 z>GLr8g#fwnAeBv{15R`xan@r(<5H>wDIIa~Ql?C%Bm)-zqvTv6e_ghUE^`s85~d3A z87xO{@fV+d_23f;gmBH$Es|iX&UPJmJ1B9}t6=UuGpKS2J_%pXdo;p{5W0z;k*4UW zbQrjGm_OsCrpH+FUQkKD2tKf$rNrhN1C|4brNgzJQr1BU`h`3mjnX(NLWCx5aG-4G z2kge(5jmV8xJVhQ!%qBkxlX)Z+J3rF7)meO1VQxXfuZ+-5`97+Q72K&ud5;Ki{2aQ zZaB0FJecaNQf=WelJIxQDv(||K^93sgF{zCq{#+y>)z-CQVIn@zfv(cn2 zT1|)~UVpV*#fTQj1kGJg&Yl_`f`^={U9D89&4-F9!b{jwyj|S27y*Y_N?Y!I0B`u+ zj3H2KVuE1zhm^`h2{C|}_~O-5XS#7R$S_oxPq;De-uDmm?=F8W&Lf2Q_l~96A||C! zC^izPQ}+&(l`51Lu@_+cy^MXH!b`kmuq4{pS=)rCN9E)^`#xCb*xx*yCD`x0qB-RkSTEV=*@qd_8n{x1Z>Uo*=v|MN zD;ZG&g#h+N!kAf6nFhi3xVI@{Ps%dqKzbwKG$;CGDT1~rZTwZ1trB1&j=%bKYCx?C zp|z}t>Ys}-!ElUXDD9Hq>#8ARl5LRi0Nq4+F+WL?5$*^dOUZh!zhA7pbUXne!4_7whZQyelgVPH9Mf$rZXllf=fCw^8^7}`D=m2tIR4QMAWA(# zaM=yu|!7S}-DZTtZ$i zX~54gAlUipZ|UiHQ8(1TwlGvN&jbs$0i*dfZ3!cK-~|rK7YJ*l^d2)H1*^?2*t;T^ zL|3giZQQY}!%51y+4u@StpHrV2^$E;6%RtCUj0|!ThnZjz-86L< zAF8fiDK-;j;D>FnWR7ab$TwxFCOS`mzYNIrzYL5UT9eP1N3+{Ej6LNYrd!R9DR!$E zuhvU&AGUJYfD8FcuLop?VTf@cOG@xsM!5jzKg9UxpCMtVeD)_%9nn=q6@tB>j40cE zSVr96dnY_XhJqYmF_(h#vSnzZV38Btv;3I$rhx~50O@SuK9^3of zcSprqiOHW$Y#)9@6v0<5`*~+`JEvJ!3coaejPkn4^1V)=zZ1Zce?{;t!utuIR?TCQgi*uo8gMr;kz)c@vS^56cM~Eo_DB8LY8c%zxsJSe< zAC!63V^ul36NPi023B91nsd5DMa}=G8@R6VFyYw z(;E554QS6y!k!~DsAax{z~)#I{(c-w0&2|~l$9u$d3PJ6I-&CuBO+{v+3QK|)yC0+xb4@rN+P^!_8h15*@?W9F~?4K-3um%y@M43xU zvtMVP?$6JI;&TjLo^H0VpPmr0L+hV+y0o4v_eiz)|AOXib&E1`h+hC&|d>!Y#M+=4p6P# zV}I_?ZN}$q<^9vsdr)wxHN9CPIs*Z3BNdhM0q>~nEQ5*fsUCz(ZuM>hX{N;&;DnOZ z-v~4#NKiuQNK`kUHuA8U6teRa=*XYuKB`-<~Ph5!zzQWg51 zD?)43FPIB>x1dTe9RUBp9(cS&)S*_Wpy(0=8sq59Sy8J1OvG4ED(>107WdS|(^BDt z!vDsl^u(Fz8zhm}5IqdhQS-FBgM6$6=Y8tj#uXYuL_K*f06d)H%SlHxG6wh@PG#@g zuEuJr9A-YL^8?EUzpyWe?X)Xl#o4BQm&ISw&uSW%qB5vUPI6l*Tsm=TF+ITY9S`TI zV&jb3tp2iR3!$%>hImQebUmyn;br0QFNA`rzgItKECN_z&-;6+ABJaI`dD>glGPE+ zeuCJ{KQB*>MQei}&4DfU8hA4an>PcRzzn4R@0QzyFnOIIE*-+8cF25a#~WN<9@Z>D z*!uv`Kl{l$Bs4FYgT>8y^GI6ta=^)N`N+2*%kk@BcLr?<>~ISIEowwv$e)BIpOP9@ ztSIKzHKrTEKkhoX*cF3hG|m&x-!y#}G9X%JF&l>;r@WbU$rb^J?Xp+>77hZx6tFHB z#S8a(^XQxoZ|NKe$7YyIvzAg`sP^T+yt?plF#}uHbG(hC@YEX%7KSx9TSRloJ_yb_ z2Ya7!`d_NheyBRAdw?mF=c0`T&>ZsBO9&jipJW3?kAX@qQf=)@c?x_TlWAv%$Y-1C zwyL^LS2!2*_jlI7S?!bC^Qg)YLu3PgMpf7XBEtStf{A0jc_6? zF2XJdzh?piHh;fY5bb@kv8YI^)r}~&3%m;kU!qd4?0SJ4gJ53e8-bNKTHmUcDsXh# zwaR@D$hm{_XiME<0E@5lE+pc{5Jc^;S6sAZxvvmqD#^MEOEo(l5aguHOPM{KbsG|n zR-An0jKE0EA&%_|d?wYo{{qHUN)2o)NO!=j$l+k2y}@37#d=wv(t0g@d>kHS6BIdC zXFq>1Dn|+Qf=WM_3S6(!7;#gU^?-I@hmi4zLt0#mK}&1OUFqv1rLM2CACOBJP%Klt z#q4{?++tjk2xS`&c#p2KojXuDQqk^;?F%kUEC+f(1me*u``+Q#>Zc`O&h?s8&&PDD z0sBCDPR~U9JHF3=r`bswUhgBrCt$OR9bbf%Ge+7ub3zL%ds{<{C`j87@8ErWVLjiz z%VNjXst$Gcq39SjqHQdwhQ3$G3tGo>7!uwUKXRR}w~2!h&KN+-m@=B;BngEkLHiN( zTo+JknF0GWH)Elc4R-{L*o;$K%kAEqHn;Mh;8k`|;Fq}IRC{GDYns+F2jg>yq%i}& zwIDA=76x-5e!+}UIUrl5)naB9M7FFVjVCqXS~Pap-5XUFugP+-l#V9fZs&h@7S zVWbTOFtt$o`5nZHV`FcaCJmf?7w8H=t>cSNS5e&ZJ#f)#R0-{hUbw%VzZXV`D!VSw2Uw%u3J5&huzdB362 zP@S9uXBcES9Eu$gAxRhs_}3B11o~#X`~0I*glJgs?}WFE2* z*`br)7}{1_8;ViYOPmt>XMl!#0Hn4^lsX!!sD84WvgIq^(0^_-Wvx8HEO|xy3MY3O zpsLO8PGy-nFkB|o%MisQV$WRaEVAkLNQak;3!d2eDI&wTi8jH;ADBKSOn~CZ=zHS& z2P2|u)*r(|Y)B_8rMTah#M_um7@t0w0dcF9x6ixNy|ThM*H&|(pMrdRjh)x+FCrE& z5TCwa=wK_>CJFp!#TrKRpLe#6h?KA)v@=^4E5zLTsHNipz7z7SGROyvJB$ zf$lh+a(H8rLblrcMz;Ljf}A3UL?a5~t&0ouQE7kv+F{3aa_&uM6JA~#Za|-y4@HT? zMU87c59d%>{izYxYT=9IePZ)L5z7}hpo{ce3a{;s>3WK|=0X-tN78j+)L zaN9!+)D0ijNU{No!_JgZ4s12m45)Mfq7oU7M@9!x%+We#*j-zdHG71nz3fuxE;$&_ zoh;k{)1|pyn1_-hU*^8NdipbF&ECGf)_H3{1`nk zjsQR3!)KoBKQ?f-5IUQ*u+UTb#vO-IK7804ZH^|+WDMg}@-3o4WRVJZfMoEXwtvx^ z(mK+P{IQ^8)(^Aj83p)Zy;AwUrZ+% z{ZJU{KFw+rC{mtIChEesk1&uw%mwuS;n;|$kl zSB3nVjNrS_1ibnIO)*efz~oybSO}XXC{b48VCIAC18Fy2o|uz;Jtyj)(q)^I6v=W| zg@Va_Dwn~}$)yKtu+N|7{9}bpJG3m&2-Ff1>#(*wS1-FQ3$h zwoz^}ET02Cbya_KDNdjV+EQV!iv%qFU^W3ncuzUM60QB3hbCU~x3nN@?Em1hgsK&l zbtlcCP5>0p@Wa+PU4MWpKsug4IqrIxt|RGj6)Y_}wVDV)i3a;z25;R={{qAYKSsuFr~$TH~&rST1gss++g2;0M1W`AqSem&g>I1{--Y%WfU zt9%AgHo~tqji?jI5L{{=kYzw>_QvFV7G^L8D;dpQbe80A@UD%|YI?9W*dlVqs&JOXI#`-GpDTXJpP_E8sS)&)VF zIC-8mKY+SCdWAIB)k2**g2-I5ng=$%q$^5i3#P1|XyIHgnRbORD|Go-(pl_QG!$p3q$6>6Wofj>U~$tw$7PuYF*)g>QnMHv0+>RxTxhWr zL5qbDESA8sDC^PdWI2@vYj}VVvBj9H`Yzl+7tnlp30NT&m8V$#7r{Cz{>Sg;b$wc0 zRR?}N=ZBU89Mk{0=>C0JUk&)&uGt#fmKU!)Bfr)#YcF@Zp{^oEz<0#T`Y z;4*amcP8;3C=*ye1T*mSk>yu%DgNS%`NQ$*=?*IF^Dz9ijJr$_U;UnLu(O7aF5%Dg zUJglbZw}-A`7kqt0CH*%u(Nt`-z&OlBE1|8#2mjXn`F|6 zsrEq;8gIDdUgYM^R2^hk{ZVl4?RQPp-eqBc{}3hStn&a0-NY?uo3KLs&_ZVen4SMn z{Q!KWry%aslim7cpga_JG5))>xkw#>xt2W;AF;20lC4ogi{GyPG6;w5@!=S?L#wmfwYOuTJ=kG@e}e7r zt02S!TafnZ)+^gLWKQRMfAAdIScU`;Am-SgcDkbJ=(-k3jzY z@^8S8aZ7dj_WGRj-=F*U3~_$5mGL*yNc#l1NPnEs4FL_aKzD3q?ti8LzA%ahxC=#Y zf_l2ua!>qcUhUqFpX<1!4P%ECnH$`%j5Xoqye<0q4)msl4CAW%&@q z-p%|00gT|DLPjXtZ@j$Ov6hG~6wz0hJr=K6B0jyF4A7FxkfVCjc>*|K?yWBYlqtD) z%gFnrvT~IB#`%24N#Yt&TlL}`G-r zTvLjDa`~O|?n8k$bs^;Gemo(^KMN3*EQvFQclN_8yeV4%L>dDm%=e?^N2v=GUy&bu znsrr4zaC#EZy5aV?X?bn-A*Y02nZjK-f08!uX5AY$3f7-0ft0jGZBh4_-}q0gBuRk zdIx!Cw-zfEwV)o~q*X_fV%?|=0gvo-CNXp*^DDqao!0Qb(m7wc1(eb!t|2_AhNl&O znUyGXEE2*-lzD3^NOSMC0-bE0z@HQ#W$3=hJMxV zWaIa1px=5Tq%O3G_{_DB{ymJD^QQ+)uFkf=&ZZSR-ycxgx*f0Lyk%_5vFrt4LDZ~d zGVi)^1t}WMUhJ6w7k#Y-YvQBg*u#9v=E8;hA zgW4DsRe!XcLp)PJwQOwoo(|me+s9&!p6%3itf&2%!k-V&j&UW|htvJ<)$y^iGt+Pp zUFB54c`KEEgq-`0jmRl(S?IT({_}>e>VlFNV+{K8m)X{NM!Qm3!A-fYXn)-Cn%d`e8uAhrrEhb*oP*V0qp<(r() zsXU&Beq>lmt%g^!EM?k={Ei4(b~mC^%hz#ReblH`NMxn`KWN?_AcRKxFLg$~2DZi1 zKwG)j%j$>$JG}I6I;U{$rFMM2N`=NFoHv{#KM=29J0z?6eJG9VSlq|K>i_X^hb`tf z-C4P-OOecLPt^Ahtpt7^-sEER`#&TUZ$SNBFLBwY5tRwQ58S;qCsq?dxj>;@hB~Sa z1QK0SpNvL<|KOT9CkiO|wLW1<(vHfrN`)2p6+~RmR)IS(i+3j3BKc+jTW|KU`1KC2 zwPW}2A$Z+p6kmkGgZ7%0Iscnw%Ghw81$o3iIpB|$8ccFy{nB?~-td$=*4rdB<9yYJ z^6#y{S^B1r)#vLwXrOR!ki;;znd2}wGlJU-z- zG}|jrw_D25U;TN_^;iyyjwwrGn;GVz=-BxNEFQoTj($t9f*>xj7 zO%}n7Zujd^M3D4~r`?1Z2c5Oq)6@iQ9i*|0SFf}cq|msYcOTANOAmpb7q#L!q0*!Z zxAl1Egu1RKEQ+})Yx8YD_VEY%MKxz>_J!(FPDiw!rc@Ueu4vtoMgJSDV^MeoAV!h5 z)&B&T&iwI#0e*iX4OAF?i;9do z+fjw2OCVDyU@OpPMNm01JZ-u_C%g1I-NdBZ8Be=h;-7(PTZ_Sd1vzW} z?brici$K+W5Fb@W^*D=zB~FV9nJwyQ!qk6Pos(vry|v{cqo#gXnWF_i{PjX%oIg*v ztFxk%SP^OTgIq3;&f5+=tGRHS^frdSSH0_Wh23!^NW9d$$xl<s@Z z!Kbvn854F7wkLmyU;z5{6o`xSo|k6B{~0Rgg`I^}cqVwkd6DkhO$IDC@1NeDLs51X9v}kw9%gfie$N z87K*VqqQ!|-Stz}i%Ni~m%ak0R3uU30N}{AAQKo_1A>-GkYHpB=Q7O(V~X^m zREXSNEN5$Xti$dab43%S@Ti(-Z-X*DBB)CiqHD-Ycbw_0$lBV|f+8ETu7sEZEflEn z{z`d2P1~Ne-QNy9H82Y;Xalx*JA(q0Le6;uS;BQnufzCaL4M6=Q}cS(ML{rJkB};0 zo{6&@`xjK5Z`!kOypC2n|ri{IhU?IjVECRSlR`LC$7z&t1jaKy9}6z5joK zJHJ+lq#blNe%x59*Qg%+il4OgW^=eJaWI_HZxX7a%$S9f|HM;J?1S3a92rVii3WC& zg-Q@xf}AOCH1A`QM3QJG6T?NmXB`EjIFed`r?zSzd%sKd3xzi7TbCP#+$zSB)luZg z+jcC!7eJbp;Eft6RA|Nfx=4e@)ZswTf0?8^{gXxOD%&X#Ym{!;;hsMn$XdU40rldN zirfZA)!KSz_H10e?X!~2%a#7F)4=qrM&XDKR-g&_{O|^r|UNgt?M$q4YBsp$sGCw*jri zAMPN4gXdB45qq##c}ahD5TTaQ#9&jKc-Pz;oHNw0->;n+j;Bt-jDBm zdX$v`aHWom54(PN8`JN3QvN-PjT_5yb|9E9DuaZQrQpZ0HkA@=j`}fY+s#Ly%5fd6 z!IT&Vq54oFbKJ|7b5M8QNzuD&0e*vmeh;mf7>W|wL)QJdR`Uf8{YRVfP_gOxIgyeX zi$onIzBCHZ(Tox69I5k+tFSldM$72zosN;LHy)sTB9a&ZVuaZiA5bu2Lir$X&fme) zBSNYl={=|L_bwyis9^j8trYcK@jqaVvJ#cyiLNqz`Tix(8pf){87!XbGoCMlZ1?I_ z#QW9FcY6Hk3xplv3G)*vy$+|2{dAp=buF|Y( zfz&Q}FKBCs3js0kV-5BrLhJweZAO6#)_2fv^Mt_iL7`Pny9J))@0OHb`3skMHJ!7EU-JIWSvUi%# z@_wP9=pc_7W{PS+ZSd&cc2-vx+D{90v26mx?9MjIG(B$rE!1(YvH4Jt6*0@GFJRgv zp!jIwAf(d#MLLb+=qNP`KxA|&P!N=4omfae0~CC=BR^VN$Iw{6QZbAAxS>qaVx!&L z`M4-$jDq%r%O4^?(6x3{Z+;Syda*a##PRJIAPO$xS1VqBfH%YQsK%oI*&;>G+AUL3 zROy{5i_5SUsP433nM=t05;27RBN?3$X+Go;>-+c+Lq*^^IFtXo*2AJDqhnBO`H$P>o>m2A6XdViJf!pE9;K_-;&G7@C3 zp9qd=kF%R7OTY}mM1Hg|D2etvL<6XHOd8zf|Ll+k=MlFpB4CoC6XpOKKkaR(AsA?O z$j3Zh)TYhPEJJ}82n7na=Df!#9ti6~t_jAWN?>^uz3`@0Lx@*IwbS($^NSG$VW81qDD;fnK0D>xgdMKp z+3oM6hI{-acltq<% zIyWAAH$~;hpE70RYBU5kzXBYam2o`W5|s;N@%kt5x6t}%zDuY7^jId`D!ItyxtXxI z_un7#@>gFU5x(A;5YIlp{(5Hgek<#CdcP&tJGU-(y~*_YG-)nj$r*aZOBH=r*afUDyo(}UjhwNZ&cO#Sa;gIPQE|Km4zx?2*ae>WKmE_x1sX{kW2>A zsVA;H`L_(1=_ul!|K5s{{EeMpa^4zMTI2gWU<8?-5T3pyGFxQ#?KDopT!JpQ+I7_L z!(trx&3$;&u8|4xShpgJBss~*a<-i5Od6`NfRnJIsPf6tS2BMebw_caC+fQ!{V+?M zsTPHaTWx35re`GX?_b$W>&L`##-b?tV_mT1w4T{y(UK>#At&?>qMxjNWGLw@^8uOB&k+p?2fxcz zA~$dvWJ2MjJ%IVTvXOj^lxRVfUIIqI`V>a5k_Ouvt9%Cu1l<9@>}}OdLg(mdT8rH+ zHXaEs)|E<7?B+=6I|#oT1%70ZU9=U@8FEJxaSDJAX0j2~Ht$en7JxQY5TK9Qmw@Hv zFfxwoxC@9E`~&X^28J@zZ#UQHuEP$pH!K(JI%C1N*v34kaxbQ1O03J=)?V?k;fmEcdD*6~rST8Jq>@P4UW z3rO!KDMm1LLOYj*#4;H_x0mqmDkQ+L_y#*=BhnLY4KvVB__Zi z@Fz%jtikbMwheAy-!x4~%|)S+oRs8cKL|;)=#5_Jl&X^llV}#oW4HkT=H2R#^miKK zmz@-DjzF|X`V~r+Nfg&1_%m{Pr7!ut9pbLX_V_?6pk(U0feH)^-~qFe?iX5I{&zlg zz}|@AC>Ti?>ZCRR@_v#P15+;Mj$FQR3e z6Mgi*tC}-1_EV}l^zGsY-yT>^eY8BAq*n?>Cw~9zvjAxCR_}-mpX|N5Q7KKRc1Rxh8v zJwV}G1H#REM3UUOjc7roW1Q1ej}VC^fP^y4`EFt;5sYAzZU8z|^yXx3q0M+z#>I_I z@MpI{Q6B8BsqnngM#-G)iu572+Z+2Fi0>YbV36H zyy5V+H2~|FjcNKUY0_PG#briOGKOpdX4r>)UaQeDfaHw01Ka9m?uBR3!%+yz?ROvx z;1p&Tzoa3&ith$aqp3ny{9bTdPqAc>trz;Z zRz9Xtg3;>gMr;Bu_^9542K(fRfjMgSPkeSiR16jAaD035|NzpYTJ7 zJDb-!jy~(R9TU=|l)=RNXV#D++zlvfr|yqMqFCwDmu~?TXC7B)ORh-B1rK+di-nIg zsYqG+c$hSar6g6KxSA2{*}_|OMP=%!-u_h9_tAp@ntfTK_RdN}Ku9f;Nc`CiY$cq* zgO}6I<)c>FE>oV zr!L<*uT$HZeejne%sLj=eOQN(czR!?oaW!DS6M9BEg}m1NKe#hp{W=Y3+cC{Tf1M62h)sQe-731lH!wc-**=WdffyX zOTE&%r>aYMdr)CmSMn#s>ukrSkN!UF#;P@p6|S{%^1x?~F+}-<w}8Rit^IOPaE+Tg8vfY#(D07<65tl5ck?Uog247iyqCJ>fztZu>PBI_ z0MxVYwlzT3H8Y6viNx?nu?G#ijmvR$At^wS8OGyqDfRRGHz?%b5s{k#UG5q3Wk)D_ zmvPF!N8$ce)5O(kxTGPDj_z0Bh&6q(_vcA1??6~5_Yqz$7Nx<%Aq1YZV0Zn80o1eZn8b5#fQPD~9u(fIK0hlH2a$U^k`rlmwJE@%7Tr*v@ zR$7`d{G|=sA6Ug=2fET z`C0wxCLlEBC^+>9ToIX&5Z(%2n!MPFZ2owea{eq)OVD+Wp4`z!{NtXpj8hauK=wjKs2YiQm|WCOxn> zSM=FE52vKnG($E_xrX)M8=rBpuEck?9>hol-IS>ar#yb5y-0{l0k{mPxh!#SX;#}; z4<~UyMyeqfhhr%4oGpRd(Kdeb;K8aB2jfe^xV^Xg08K7?tYbxP-i4bMjjm@ObD72@ z$EHw~NbdOXV%YT&%;}l<g{ywD z4v=Et9;nwdH}Wi2tnr3I!?|;}yt7RO5E>qkEw_10nuSlPz-uj*#lFomHlku+5;q7X z(^~x8Spv7YihwuNpI)`ftLk{O2h1POUM0^obUq$nOAw!gcdyUN** zLyh2R{b{V7+i?nv%Gd>uoWAS|%ya`{r$bxtMWAX5whwC|ev1}O^4oh9ONGTFd>k1X z$`RFPTXa)Bx?azf{`o%fiFM<7eZ&+PS`B=wdsAZERWA~J+(;uqbjKxt@}{1Bn=p2Z zZJ8QO7j@xk5{`EwbWv)8h3;Yq&c5hloPssF!*MVF$UM-T?NDg%NSirY$yV@Kc)JUf z@1N7rH;{K_hEW*1kmx$TOEPE~7j|qjy%W6#WXHNFwmXXzKZc+9`!2Nz^dX$a_(pRU zY%!6hL$ejDJP%m7TJ;jNbJ{V0%BR4GhhkK2dWDdi)T)GB8Ouez*0OFjj5S@XwmiFA8<>;!tMp%Suse2gtpDtHmUm}Jw*BXu6t7TWIw z(K7N+>ZZ2+=@FQ(U2}uytz&OxZB*=CuSlRgxIAOm72EWn|0nmj)@-!Z&8TM>sbvQhz!^*ZQx|j&OZtVeV$_YH9@t}e**V@g%>%1VT zqKY~u{fZ{VU@11q1LZW(8apcVOj9h97ezSMgf@&h-vwn17e^k2{be$zj^j`1tV6?K zvI5;88=tqPBsbC9{igj~N66A+Ar9O8{LsH?VzVuZ6jc@eyXfD<>9 zf0QttlAv=!nS_RUBi-{R_WbcPKFqBV%oTj?pO$Dj7=tHoKp2mc^Jiy(J`vW;l2?5y z1IPJyY_Kf`?URS@fZ>M?h|<#vZZ=rDVLZ9*@y}X=5AIjLaN5ZI-z&!Excrt~9Goqo z-0{~cQr(I}kp(^76gWDLW75-_VvT(umB}^w*vCz}#n8_He-tV6nAs1MXfrXYFbw5{ z>5;`)s2%VMkm&K3Nc36CkzG2^V@#W7tBU<(A8YAE5cO)2bO_#XIpOjJi8R(WhyHF_Cy8u2hNwgt$Xb3Yz5=d`AZ?doJ#;CfcT%&|V;D z#l}B)rr>7VF;g0(xwj6DPLsg=$Q3rL+e3Lzra811KVO;AUQnX zq&ex|%<;%d*W1`0+8VTR77|3knq1T}2}*Ihv|ac~i22g&A@y^h>-IS1qotlzcziWu zIH8U;1BzAbV%$?Ik+U@v@~#k|kQ$D4t-|`<)s`BK(}-8}9+w`!xO~)&AtHhh zoC4HM+B2pQTsbU%wO-=SR)=FDFe%*a(Q=DOLNw;P5~hIqo=}>gHMfkwAauA+@Divi zLhl5G!`2mJ&JQ+MmhcUg3j9Ia;i;$jvBStq;h)UA&`4j0-ATF%i}Y~f537bT;S(A{C*O_b0x-J-oo`4G7L<;f+3F!qJBu1kXOSsVqrVKTYmd-`j>Ui zgTo(W$Sj=uZYl91F?MjR#V>viEN*m!9`Nbga)9amd*LED*%WZ7QAx)LV>rmCvj~&3 zgwwQC|9f$pV%kaeY=j5k>PXz6ee5>HA4^zv^PyW7oLJ7tUW#?gM@B?(y!NtQsxj!$DT~P1o_^Y*@82=j^^T8s)S2hSZ=0CL^ zj=rZw5E!$qC{X?uNnm(@0R^rbjn&=O2&*>kYG;nqakBFxdf)hf;PP|?aRhH_1ev+hEaHFW0 z?zA2MD01G*-7^6_@xo3<(q(>eAJF>^kNUB+Zibt5QQBi}Ix3s7GX~Ohux=KX(^(4f zi^P`|gB;3B=}sXmCYdXIx<@S7 zkyQk$-mWq065~HJkFz>Uq?JxVq=C;HJP=ffkVTp_Fq^#`JtmKj7b6-u$X=y^y-Z{< z2jL~OTj*UPrjxoKxQ1!C3LEza!d`EU+61d4Q2O80>M1s@M3_Fg+ckc=gs==4F(xjF zy#3=TyV7*&k9ZwWk5fF$KNK$*Awpb|vQam%U-_MJ^*8_2Lg`Ur6n0;$N1dFjLW!}7 zn!5Ixqt`$}X>S@?X`~$5B*PrHj+wrZ3yn?k-?1^j$#76yZnut7HLtQ}zn4I0;^21N zk$x#KW4v38@kX3c7HRQ|X2rkpp9va~17izH3IVqz$ssH49;5P0X8ciwxFM8X+1%=u zGb8Wc5eFLBT=+`ndD2SV9K%12nw7>g`Xq4FKXB2k^XaP zEuH4qyDS3t|L$j^2lAxK>O$pG2{lo|s4VN7$m}vmnj$ zL{KWzm-F=@(M{|)2U17>mku_$Davb8}7*)9GrgHbu(q4*Uu3!Vg zJr5@Ngl8Z5U3iJKf6zbl`K>A1w-Uk%e^*o%gt#2P<(h)^yR!jK`e&_J6r1VKg(xx8 z!5AdHs2>`m;V+j2zBK~LnuQXR?;0_-`Ic*K)Uq%B^J%LX#EX02yk>VFTks6ctkU_3 zq?kNAMxvqeKPVlihq0n&(?ueFTdzKa>Ai@u65_=k!ys$A#Qz6A#}oUKXQ>RSp&GxJ zxijWnd*|h{IW`@EtGula3MFD3y4>$oqzG&l1~k?XtS3vj+C(4wIE_$*Sm^rcGhn^n zWPKffxcUqpJ~8F`8fMDcbCB@zMl$kYz&uMoLkPCNMlbtaWm&NO61Lu`Rs=f>t1^RN zmX;x~1GMcExGQGLn=G6z;3x=@7C@aH;1-(7q*{FG5wyY0nP9XfSx>!q5`15{F-+k* zGaA~;W1`*sG}Zmv=lH+)&y+PH5gz^`wM>`+5gq`wSP>do4#fuFe0KlupejE6eKrh0 z2i%c}EO{4zD9nwDm+D#iRM_?eF;eMDLEK za2-zOs@U6ufxW7-qUZ)E2UlY5F(h=A z;52@@=rOBN&xAnrE#BQv)Qu-ZLabW%1`bQ_-*=!_|D z8=#|D{fl61ni7aen}Xo`il*!=N|Fju8khTTvX7!Dy_lb#EB*7SXG2EO4~@S?9?$oW z$Q`Ib6vU3m-=KvU6(Gq(BR}z+Ky%`XdI2>sJS-ZGTW593O1neu5{hu?g@Bi~QIw+!i-~1vn0ADv5_r?6*h-PRkzwkAb1fm-m>EkfbAW%mb zjQalbLa?I4Unxb@R^?x3RHc=*p>J*dsvi+2P6=LrEjVdh3sC?bVOW+;9Pyw3&{%W` z<1!1vxE?7~h{yheG0m{}BSK9zjoSRx(z0UJJYZ7WV+W_If({UBb*O@hx;UIbYR)?O zdbK}wJng{ig+ZN_TJmm#{ScKXC0(40JJ5EAnbB^O5-(&5IFR6fNr-I&m34s(6mFN| zsFUV%C}1jf{{4D5IskX%Wbl0)+ad};(OiU#|Bg^zdUtSrbI}@m=#EqM+e9e`py{y! z*qnfkJlL}KcnK{KKuBjzbxhhBe^CY0`sHf*r1W@^JS_y~DvvgR-TTZ>w;~=$FYjP$ zf~($XTF5CXcuf4Vnl=%>wlET2xypd&3y#|*(4f8vEqu9!_a(#L1D%MY3ie=r@Lwci zjtJ}jV(-nvseb$Y(MW}oWzKBLOfqFEGnq4w2_Z#PNQHig`o_p|r@UDvs;bDit_`Fx+1_4$0({kiY=`!&6*bmX9D?2~Jee(ulC zR*x+NAO`!xeUQ69bi|+$68Q7cH)@Mp88s~Hv<^Ga^pxQ&HIcS92lvjVv zUJMG;$t^y#2vazn?O~?c&JL=t@dvtrcW{35R;^UazW&;#E;S12O7&a@rnjQp=KSlT zGkr8U9jY6eLutwz&aaE&lfmP}91CLsx0pXpp&s$x2zYpxyY5E{K0^<$D9PAzpPj-O zPaOochMeT22zj(RU91f;4JC@IT#(d$G?n7uaYKwjWE^D6>$tV^-gSbx=lS=l>pd4m zij7M};L9I1eFJU55x_3$YC+qz&%5n98DYvwc)E<&kkchZ^K{;8GDX(-d5}!x-b_jd z?YVJhf<`kI4@Gl-f055DC=HJ-Y=5n+E=4Oj0glFKugUq1k`I8vJN$%%H_P0`CX{^z zB0iJhO%~u6{#>&T@XisW-7z{c7V3~y?ZT5icD{c=tuVqe6^?Wx_pyz!mB)}~ZBYSv zv8iZgB;d@?Q+GEZ^a#&(axMt>-izZwrT%4`%9Ej6l;~m(%ixK6{%CFU<_60zf-R7;>0%n!d}iH#cNaxap$U?;$Fk zW2bd7V;f$Oo%+o!1p6|e5adgPloJ3Zn};|g+?Uzr`ko9zvH-l#odMAe_lcd@w^-Lc zRV_VM>@|!``(uy!Z{^+)@!pZCa7#e1>5QMPYh(g8>Sf~LhY}052Nr>|pmSP-kjNzX zIg=TVI3|I?@kPuBUW0t6ALiA+>*2?p@TWRa_B-#kv-x!`BjNYTR!OS^{cONWA2BH0 zsm@4<4JrJ3$P2cd2}K5STw`TaMG}$<+8uf@57aLx7w}LUJQqB}&yx#=8|^p0a-A!x z5@)J_a(I7f{0YSS4*Fy@BCads$vVg1HnpQGM3z4p?oNB+vBUkBJGOq|1)hAAa$v+m zLf)j3olAFN*-ftqqDq!TjAAqksSK=G^{m!7x=NSoCDF#X|J5qB%2Rqj;CfMKJbP^5 z*uLDK(OejheG0{Kus{82DbJJGW0Htx7a?n z_bTmPinTMDZtO=pq)xAeqm=|1ECdO%@2iF?Y~1K^;EssNkE8``5kX>pJl1N3!dO$; z(}gFF{cH>sMj~;00EUVd%pG?>zU`;>2S!eO!O$(dip^~7Czq=-Cc25mZ3ac5yi(KZ zdhKU&A;{pBW%^BdpC8Zmh<8x`RIYW<(f!@R;?*&dasz@l_MOhCxwHr&uLExd0WLkS zbls5fE0ChY_9zP1EdScY&Xgn78^8u9g91%t;A}26qoBLZG>+FBO>@Z5KnGRc5!N9_ zl}y6zXU1y7kcXZawprjkm#`X4TRCS53BO(k)5DHyCJ2-_#-^@CpCIO;Pls*TG5^FJ z$2RV)JmV76(2%x~4Fm9m9lws|^yy<8lK8Wn0fuAIP|*O*9;IT~UCHJd2GKljniFes3Q|SPYbC5-{s;(_n7YQZ|)Y z`uB#l3tomgbq3UZ@Y$D?{clQ74(l2}Ho4GPX;f@%4>S7mf$(7uQ^q45?3w2d79NKu zQgqj3Pomw{8_s_}5L}{zITN&p%sD)gB^U4HT)!@lJ+Xe2y%1w?T@hB7xmV>4Xs=8k zs6)?m!Xrb@E^_F`<_6jL`5@*iWr76Dx93KXaSlR)*t`Zq(wJ<9r|)z~MR>mJiNn4ls{NvdZbjbwggX_~h6m zs%$**(6T+DMRN6yn`zZ|ls$NFk?aF&Nqai@SwEiA$U|HJ#A+pk0;Tm=H4*bnj*X=Xy;qenzXm5*hFv@xk)%lgXv3@3AB zE{R*N3Iz`}K{f@-kD7p#ZT`xTk}KOi?=DqFO-|U(cHNDqzV1)@shZz~pw^-c_83Fy z2~Xf~oIg$@SDYnV!O4gBYCi=sc0jG`^i5u|!UCKs`Nty|?4gb_9_0Aqe(b3`b#s8# zy+)ew^fv92g04TBo&_E~2P0;EY>xdxMTo53dTJP%o&vV%?S=K_pG&Sp9H?#=0e773 zF2B6l@I9NN-yHUghRV?-@>u$;oVoRZWmct&dtS3)>{+_4vQsV1W7p3bZYYK5TA1}^ z2y(?rzi@VuVpSk6oyIjng_H&POri6mPmHJZpOtQuz^?^Ik3aS zKW=W<6^Qdn1+mRw>ND*WF<~^$^^*zl>79Q5HTsFZ13!1X1-Xxyj?7|Qy@D5TY4pUx z$_bN~DiW$;fQrM#*15g1mTVpccG2yU!g*HF29Zam7-tlnusM45U$S4o<34Q(^mnnC zf;GK_;9k9qFNeEYUhi=IDw5t>4Gn+3QqcbD3~NnO#v!|KmvE_2&NMQ?J$heKuX$hp zP&U>qv=MH*tMEOza085euZtpVAP9#Ic!+5QxJLEzpOW;6@Uf=Y9kN)WLeU!V6l%?j z`C7>~H_FH%yFNV{p2wDA3@$F)Q|$~&$e zb2-_3AmG8L4gmP3Yh|hkHFMpuXclgO z;2MGB1ue;oXJNhzL>7mJT8}21`V|(-m2|td71P7B_^pd;%Pexv#+jR|tm7DJKz**!vR-58P8XKOs= zOoM$oK8vxXM3n92Ty{}c*k1Opz!~c-(@TDQEVNmv%$b-yu{e9j2vco31c!S>1(k>_ z-#zZFip@J@!BF!#G<7FI!`OjXGp^@1gLnK~t)aI7y93RPOD<~*Dc#OOwt@XGIcAHn zAxXGBU{*oea9>Ce%jct7{>G*9Y$2*EIDwELYjGZv$hHlo+`ai z2}mlOa}wqKl#LL(wK)rBX-7I(i*=cK?lgYv?3kOuD(|lv$)EZf2tM}SDjb2QJ;fOOAma`Bi)Ewbg zR?Q%XyPj82|H?y{x`V)hotE|H)<3Z5y%xQX@Pjj@CP!(BY5DVgOp@L9^z4CLvXRRs zzoz=m-a1gysK|AhfsTTNgzm6Kw?KcwIcALTYHz*QRmO)&xd$p$EB9XFj1)ONm~`}d zQwX)T2du3Kc$=edhh|)sl3FY zR$7ko%u9aJ1ML9=HaZLBF%%fes9+ZV0BC>4__6~qkCJ&9P^fXljyXtmG!cUH7TFR|pJ`XLS>Z0>uc|6%vRW9PDkZp9mdEO4D+K~=Kq6qgj`0V|Vx zhwDGYx{vW|juBwl?M%VDKKD&w%J5baWqQP=bB$VDYxK+b_8tXIV`&bDhz4KPY9B*$ zG5kJKO*v|AfOG!ju7q5=N}UAh(RxZpK~hfDE0WJUZ?h4_Q&WbUYfhhe{+@#NVskis zH7id6W*UmhLDMF^O^rRy57RLtk|nfGcO8>1iW)cvCNfZ|MaSTL_@JM7(er9Q_QXxUM5Z#DN1h+?A8e?0!qM#QdX z32D#Pr%}m>H@< zN3VF3&^Qg*g)zOwFG2>1Ta&UlzQe^lE}Y|a z?qBWO&Mgc*{NQuGkJzoBTsS}a1pPx_q}Iqkb-btZ@)5OZ)yMrIxOYFJ-{Z9p9jbbo zUYKX(5=&w+F-di+;dO7WGMr0~$Mu39`;~GTI4<<&s@pIB__Wk(aL=%nQS-<*+cj`{ z58HY@S5)CN@%rhBF)}nH)p!R&#kl2{I)9sOcGexv9IuHvLX+}6xh`J{m8T)Tq|ATH z!u$BCubRISm$oTdqbe{$TbT#Myi`W`uP`g~xEa$JOgu#$|EOV1*k9d3%%t&}B@=9k zw0q8ahqCJm0a%Ia#Gib8cA-(%^Hu_CVN0C304n;UavAR|SgIKy=C}zlEY#lV?9o?< zw!pz3u{dQ_uyCSzs=xPW!UmYfY&TEbGUtyd|MQ*oVk1MAs~BCIlm@BS6ug8|6u8}J z@|!#X4ek!~o<>uiorC$I$@NP^FPnu*E$izBp;@7n2<&D~_`CQbo>XUChfC+WvELnF zTv0+?c{aKK^JzAmP~}*lZj2Feuuirgh@#&{f8Bs4y5grg7_@X#RYEJXK*3TAU}c2I z_u9#hY?ZKm5;NdPBxkh9h&JLW^uICPlM`gh_bP^nKk9_~AGl$XAj_E74Zb#Eg|Pcm zA~)_^H!uYn7rT3j*c+3=dM5e{4V;sBW5_TV)?Sil9F_eK&b;h^NGm5?7vJ!wi+{F? z(hcSzh$Izm?+xZd+^T<8=!fpZ$2T=+=>PuidE!<>8NH~%pXv-*QllV_^u--1jXQEB zzHr>-h;K}+%v%manWy%URhW<&^Y%BAIQhpuo`qNK2w?v;5h~`7t~fK&(bx=SD(qx@ zco}LvkVOmUL)0owxd!K2Qf{?|%+@)Ukz3o}Z~+x<7Z~0x7Q)G@@^nj*c&WEBZl4;o z^kw5kX?uU_l1qNv!8q>o+@HiAHOLApZC0C*wR!UOWdt7B#s4t0yB-=m1s3QF=9TA8 z-};sTfw|(BWS!&P8~{1xoUd|xP3fobpLOkbiS1OkzLoIm6j>cO8Zw77-qvs z@{lthV9^II%GkThX^M)H?c8@|67L}R1mU<*bLH404r9#`ha5@`?nWAE=lHIC4(4s! z&GrR=Wa{~fT=F3Pw0|-v8(w3YF)>Y#od{)IDz-JbVJb*|?1I2pagK_d)-_QhVZbuB{h??Ks*8uKUYp?Qu{?5{D?c( z{GKfAW?uXWy@zo4#nx!7I5qr@r!)kV)R-n~ur%Dum-?!S*9cDfRw)jG{igC;qA#It zhCnOaPc=WQ{`&|>P9i7_Y+NbtQr%nyyQL{% zwhD!B+&#MC@Bnl|Y@xrs%(6rzr8SI?*xMm;W1PidO;uzT{&X4R?ME z+NymCmXIszKi0l+Z1`)46%&5_-w;yzfm_d>$fCFLGQ8^I-*lo_WE3w;oJ-|5E)m+f zXMd$xU~pDQ)EGeRj*xg+p|I}_f;+Te*j*a*8~NZQiC?V(u>7Vo36C7G1j8(56}r9I zQfRtG=cgdn3y`2LvRA;{a|?Y%o-CkgXr34ITfU-^hf;Yhw1!urz;P+E5*6!|&EY+VtKB zO~1k8Dhm0VVNy`zc0fm?N1-3qz$b_u?w(ennBajHY7UvY~t661;@wkJAcTm0FyIDenyWUxDtli-&o92^cTpi7}uXw$(9& zRL%$Aqs`^l`t%oSzY_d?JcawPy7X+T5 zfGwYicNX5~3CLa%zO9{>R5!FV{rY8zc~$#2KkELewUs~Ug72)yFjZx3EN z{qTsPmJj9ytg=K3?tJE_jCUmIm4&@|5*0TT2=)y~k_tIq0ZW2PIy>G%NTFMK+Yng@ zU-uQ?G9Y@ey$wEE*d4Jd0egS}c#Y5#w@*s~R6k$>!l^{yU@$YbLFQWX&vSrlJZQH| zOQLmr`LXq8C6HpnF4<|LBHj7gjPnqdlM3dU-fxifJOPc87}y#r+_P;j7!EUEeb<9# zy-k4DT?FMV&Ey9BLo&Z-!}{Du#tcf^iXuoaORK!N?F}RoBnIy;s#fv6K9mbsN9nKBlqxhGOTnrI{HQnSe3Re$n*T zpwXE}q!tQd{k@5dX1GL;H$f7XQLOZTepxeqvE} zNI5ZQ1L(AYoNI=C1(;pFj4KElNrq{yQxKnCiXsS1Kj^QzqGT7wHOx3NiT^%ICY%4a zR>C$gR(4(nHc0H$d|{3r(VQagf-+3FnfTRFiT2z@((<()UF~aGn9EQsNy$gr6j!D> zNJ=^-KI{~`C}VZ<#r~~d-##}Pdw_leGp&mK`V z`0a6|m$6dJk63u3XozD!Ps=<{{GaL@ima-{{MDtI^M}J_c$h2{yv(JWVM+uTu??%aow_HEg^Q2##b4~x$wg7k$&gVm(l>GGY+Y1 z`VjxU&dH$cH+*Md4@#K-_I2PT?bf#v|G7#^=NR$0lRy1E*mJ2|j<>Zdr>}uKl)CKk_9g{3gH0Y)FU(7neu(z{w)q}>Mzr0D$6DK?9;km;NA2`4W&fWXo`*u$7{`$-ez zkmVtldf^>&<|KCABlvq7fO}e?*ld9m#T1xO9`NNswb^mvOf9#b^ALxX4?lv1>c2OFHVybSFA+?mV zKp{H7r#l>;&=8PsEjyM|#l42+QlTu$x*p9EcC8o#7+-@q^;X;4BoGJ954WuT z_SNsqCClHBu0B*GEew&s&kde8)@#OD<3Mw>3|^gBdUHjuz0K z3Hn2>9AtsPz%{*1BD_LKiWXI{ZA*n)8L54Jo0rgNySlDl*nMYE^*Mvfvq=be6oQ*5 z9`sq8nNgv&gic{YX`lMA78@aicRh-jD7!qR&-f@lm+(Kcq(fIG8ZV7eVY{()!z;fy zHdA^T7n*||?nt{krDzjR1GQyM5=^VILtmq&mdPJ`1xTRBEZD5a9 z#BW7xv0V97Tv}zPZ+I?zp~!v&j4u1r|MP0yWLQ9n=*@krizlR~I4UlEQlu(1u{wYk zBmTR0d^vGH`1Hljb+h4GZxXOilL{1Pj>oK!s8L z2!IR*GWF7uDr`sbKU598uc%H(_Vz-P`<5U9$nHeN*D(m`M)kSW+8X@-DG-#B0+A*u zkdw@NcEh!l?XTMB-dDwzJ4gpN-=cAzkFapN1LT<^Gf$ECKj0QDj!i=Hiez!;6th~_ zJbJNn(WsW97qt(s1(_1r6hy!KhrNK@hVvheP8Z||_-#P;ls!6-l$39w_UjlZZsid`LD4v@mr%qi^gtv$2mo5hA31rui+nP zxH2A4WXkTm0keq`EFxLuMmiu(;V}%bSRy=N=iVO2YY&as1oVxw_^o*-MVDXBA^H12r$Z0WgglT#&-v|J^u61{v@5c`u;VVzWjf1VcOIuZa#yK z=sjfm&?Weeo?U|xJ`95X8xT>L4_^BTfa@fX6mIHuv5ATVacO{l=!5nTm|;}#SU@wd zM7s)kezxeafQ|2L+j%M4ztE|x1(meD1Qb$rpYp0`{0z6-@R)_&hj7*-nDbCSz)0`k0id~51>qb62fapKd`B$=q$X4=i|Jb- zmwXMAN)3kv!KlA@qohWa_TO*UzaueYGKIE`%M*%Tu*s9*%SS)8i`}0+`B_=}8obw1 zP?`rz#h6mN%dv+1^&JW-pJfaUo;&=!cwLW9z|`7EKk^sK8FK?cRVs?)9g)BL3b8v# ziGDct=hd!s86|;RF&7OkeokDccG#oIgqDJ=!jOy#8xel-dna(^e`aZkD=~plD(-oO zqg7D&8@AlKEKKjUjs}*kdZw>`%575wFYPHyK~}8!0Qi zjRNskQ&Uz7A5U7T9=-+T7(G)JjS8C{e$n}2wY7d0Do>3mM$xLs6B775jR5FwbxeZ> zPNc5~r_cX8=#DDPZJ_M*Qq0yrWv6fg$74QpQk0#8P@2}ymU>!w30qfY^~0VmR%KAU z6I!6-_!h`(iY!HT^el|QQ0)Uu0dwk&_)B5}#Yi z=25X8+up$d`cw6O3=%k}<2j&%Pl8n$^rfyk*_G%wq?!(!-shl=7R3LN#AelDO;*@U z`Xug3vm;d=jzmgh=E=MX_}?rc(yC+ACsBEN1ybb*Jqx%#2krK4~ zTN08o)W2}NElmVbzE@GeLWR?y$Rj~mA$G4|@>(A#G_7s7FL=cZaS{9Jwhn3J+7K`!9{gf;H0*E+sLYemdr~#WOiLn{I1XqM@$>L{c#&p-9(3Sumlk_)Z?G9^M`2|Yr?6y#Jy^gw`bVhZS^ zhQ*u)y5DSo9H$e4EG(i+`*)B$S%47czQ+K=On|IB(eX-bWrfd%CyEkD4%ka){Bd@e z0$-o5jb`CI{0^&=rm6+RPQLi^XB@H+e&+%8AwqKr1q&Qy-vf5UhpF@MUB#_xzL1k1ObfTF6qDj@#C)R^2Nrb9gxnWU20yX{69gfyr1o&8#w3`Y)HAc zG0p=W_&CwI#zW8*CjCQp9=|O+Pih6L_$gmswJXn!J}9^lVBEZs%c;u}|jSNCC6+wK7y(Tc0fQMM6bsCbMcf-OBg-GQsz<_IqV zrJ?s*_bcoablH!d4Tn?pLB><}F^H zq_A~0B)aL|OJ>ERC>kN5V8Vb~yYU|h1`f3bY7j>d75 z-zi$(1h+D^Oc$ivVL@^(mb`ra0>~2+4!AZpK%dnI0e|yPcaodVg);7JS$;h0I1Cd; z=TTaZbM;`e<($V@ghU5yKpiMYrh3Hl{8tfQM`W`2%6D6bnKR$$FE-{wT3IEA4u*(| zB3s!1@Q1xH0qlO}!Mu)~A%tv6)N1T4OU^@;!YGwrndV^tE|%%A96+%4D|4Th0%hrP zK*aa?rcBW~U3nW4W|NUIdXpOiU-H39vB-<3WjYPIR`b zJ-=-A$WGzr)w|g>`JeuYgEe~o!{~5=qBRu%rhMDR!6K^E*L5N%Nyyz>u|d>pKW)0u zj*Bo^EeNzK9ZFgF>#xpOSb6gvz&VT_(A(HNKRss7^jc^cM|^mB<+y zvq3!5K=9XjYClRm@Msgf{q2fF>yU@?jgwpPh)WNz$)^LX8GTSQCP581_`_gj;IpGd z#xD|=DwJg5sF;J{;~Yh~F3LqqE#!5Kt$R1YEkM&%2clCgplzJwH<#VIB**rp z8u9%;wn}gt>$syaai8JOD<)7=uc(AMwWsJ5*;s2$=+=LtR7xPQ(A0cJIMCKfIMWP4Qz32Z`qfI<@* z1hMhSMClr$xtX26D*^sZg(N3q$3$J@Xk!avBonWIail45FikRCQHPmVf9(6cv3KwA zlOP1MQS2NywcjYd3m0Yppn8f|{aI4#irxj!-rKI1bu4r*)aE29>cgN9`@6P~gHdjl zAvwz3%$UPJi+g^D zxZFc+;c~O6OC%NKV;l$O=0*+X;yD)|P!rAMJuj z2^ru|!G@w=_#U}}29>H)8fmYNsC?q`VNaO_lsh+9FUT+u#OJCGR1` z6Qxh>%+hf6Q*+&!k+Y7xN^-#FRJU{I#)xHEw=j(!1*;Jd?Za|RFLSPs?%$#A4O_oJ z;i&sNf^+k5FA~W5R8Jl7pl!yRSV;Bv&q+&&{Wn&KkRyL$6wKwEJppm8_4<#%^;V&} zjxk7Iftn@t`};@SSELbQ5OVbQ!yeB?=5Rc*?EO=BZ2=J$8*U{B4T;3J2@BULGKL$i zK;!jTj;niqlKc%Pj?hV%0kK=DE#YT~OYCmy_^P6qWU^@#X1HA0T%mf#>wB|^*3S|P zv;3H2bkR2~crWQi|EIb;5tU30e0`P)=O2h8PJJa03B9XA5iRd4V1bg>reJ!BvRm~w zu@d%gK|U+Zb>Y;%QhEK3JP`{X;`^Ncg&M(^FJJ1-j)$#!wJ4VF1r}u6q$<`BZ~P{n z(CTCxyS5fCIaA%Kvh*@KukOqj<>(WMZ*S=9a9;JR622NM68cwokAxJ#dt>F0qqr5~ z_(%FZm1@8Y7EY=ya8K%}uKX@|&qj7dTGf{I78-E7!DyLe05l4HS&GzavGQL^!90~D zvo!Dm@Vx=U`N|y!t`XdeyfP zt*)O21v_<#-fjKSN56O;1^^tn7GkbMF|e?WJNfh-ERx}IN1M{>K8HfSxAX@8zB@Z5PuH(Z!6OaUtgToLY2VeSji~o>G00~&Cc@v{+OJD5 zXhAeov|1pWkF`I{>|7L8C|s13Z+j?ljt8z|?%TN!)PC~#6Y26%PzRg@i1N@W=jqbx zwh)H;Hbt&>I|DGL^M8bFE zZZxd?Gh!0+e*c?^ceQSvz`{DN$v|LbU$)BLzS5HtxUvl>#KvQgR4%@}h62RkWIHww z=c-ZBFVI`!IvN1OlAs1H)34`FzxJF7!X@)nqgW=;=7UCS)S{3}6wV05h44HKJxKvv z=cGO|s9yZRAca&9o=U7pRwjDon`x?Q`ciWg>qX=x>w}?eIGOwTd$r9L-ixorTh<{0 zkIW}cT>ykxRkn6aF-WnJ~w*mw~fl%aV*FKx0L8{v7u5SV3WQA+nQPF1c+J;td47){8*0P7q%>dV;-oco6JBod~)x zvTx;2Y?cg-dJ;JM8EiOOaB`ID52Lyt&gr2|R`-5A+6&pN7A{RR_Ap{NM6NyR4Y|KJ z*k#0^{iHdmzYV(l8_^bwHnx_071+&Ln)!;^d!c8yE7@&j<^bz?i6ZXt+c(@AZ-B=) z=?}Z+<<#|4YF2?^WfM|uOQ%EULW(?4Plz0TX)8mB zcF?swT=S8z!mf={(^7qwfx9es{yKEboe0sTF|fc?589{ZYOCb^p4+*9bQ1z)LnF{{ zft>As%v6qdjrZge7ueL5AL+&)+Fo&Y8gI&RarhndjC=t_!uhDNwy{?fo2|DGYJ+Ov z&{X5ySWg+RrOF$+O58f>PUxupF!q6|Hpg0@{E2=r-+;W39E>$VV7(|9LMmVzK4}xm z%D?#=fK-WV&PX6wBv2iF)=>QV=~Rh}7cPD>DK_q0eTc?ozuBaIVzdfq%`EqumbfEC z=^u9+Q)DfiI*H#5e>Ex1^a1nQx6oA{sY@|{r@@I^fi_>)+_Ue1HG|kWO!gxchk1xe ztx_EYtX86+faea(tPkf@drV6+y#epUlIyExjmPx`EHku4cF=uZk2tGn*r#t^<#;AU zmdN7YC|8iMmz)5KoK9iU(>^skae>b%j>$$sIEs4ZbkaiY)3bC{=F^06_@X0L_Q}xZ z4>)YdqRM3zD0rmsFZXT%PzMUSD(sQdfP4z-e;8}^CC~p?LM9Lyv@(gFPGs@?f`yn< zmQ*)jvX^dBWF^)Vo)G9#T&DmVn;8oH^%7;ti(5{P5ta|pLpHQw$-CA8PtMstql^D_ zi95JC&Mc@~4<%Vj&3B02NdWAJzXM(}v$n`;-EX>&<_|&8;9B^#e+1kq3K^x&A=R5l z=fg;2in8s_2<`(qBglL5mL2oIeQw7d=F8C$N*X+O!8S{y%u{Qo^SEboeNrw^nE*M} zdA?bM)}aJ|efq16zsw?7h(3+W5KG>0Tj8s~Q21huiQZl19r$$kC1+JZ$;pSWmL?%` zwXK-l^J3<`aEa?HS*Fbet?N z>f~@EmCC2_&37j@p%DKzb45guVy7DlQ_f4Y6hV#kA&N1PPVju4z16FvSSvtu`k=f_ z5vN&_T4_7k)gdk-T8UZMa*gM~zjJafj9KD4HW=B$3FbpiYS`x&VD87gJnDaA)Lt$t zJ=i34`Vn#iv9$9_Y&xV~%d-n$59ICQye8+(e)%k;JN;J9!g;c%B4839G!HwuZ|uQ0syfx<$Fj>Z8V!ciqA z2*%YYzC!tc#1&U@BYi{Q*-*<{C5i$lUHj21mt$RQA7#2Y-t(SLtGhaTp^dBSIm-5X zFrL!j;<3-BZPi-KV)^vr=odUoygzkCLma3dv&P3?&dt>ixYRtuHiJexMm!_sU!j`peiS3k$v26>x+~WmwFdEkn!;1f%o!+~@Pz_s))Q}q7SOwWybXs3m`vV6OmzkQLji#sa=>a>KXxa?+0-3V-- zHEHrK9;NTt{6^Q$LC+AwqHE-0Ky0Le&*96u^!7?0LUk89@*&#|&r>?HQL@ji{fmg7rEXT&RQJ z)GI5%1~+s?@30lv&nf^B^HLyoRjuYWG%`FM`BIM`Yim(+bKv$Fl6dM~dhYz?3zR!D z#@rv!X0^xs4C&Cq^Z^%Iswk{N6W|o{iY9xnnVq)~*Q&_bS4?g&(#?EV+*yTv2W{Hj z*m554uH`hO<0yx&`HefKbusw z(2O}D-N5J%y5+?!ROM<0ElZ`q-BWu`eaCM{ANldyQO=x-Sv*_Z?HfEk@zJuu2UNc= zD=FHv-6JX=+vG`EzLLFs`&7skHnV~lj7Y1X2Jh^c4(aXOOzYA6q_s^!)HFX)ii7IV zy24Cjy6ug~XDbrpiC3_`(PoAQajLyl+5RJ-)iXvD<9bJ}LeCTYF2E>^+!`0*8oK4A z6#bJTkIc|ux+S9m*3kHs8VaCosZ~)SdbWO`cGO z;u>bELqN~s#7(ByS(fKP_qp#8CFk+2IV}*^VdA$bxJf;UJzQI2}L!?h|}LzIM_jtIRxs0rxwGPRWrBq1-=ItsnjCo@14Cx zOEK{|CWA-2gF8cXYyd3P@X-bt*UMEkSKEx`ym#FnAecQ3MdH~R(ck-VkTZ_z;rLj< z*c!t7g!DFn?sDci)Nk59YT@=Qpy>K^0K<9N8CSpX14ZGQ*=n0?^CDfi>%SzKq@1jxLPknf~ z-}Pr$m|4wE%-i^Dh045a@A{ibZxhcI(z!lnJkR*S;<>9r=3aHt)KX`Bzk9K$wr7$H zfk17^{4<4U!bEWwWRjIfHZ#PGWQLq=Q=z|5m8juYNkK_+q#ULk(AXgbQ9fSAEAA`% zDYZ3Fx%;}JJcVOu>LdUeHO!>XzSM3+G1KQ~#}!m|apvPBU&&}_1igq|aQ!u!8(h^q zvHk(<3;q1}AKQrPE5y_W=qT?{J23O(2H_ah`S^w(`&N}O-lL_XlcAxltcI3^^Yf2U z!EKt8YaDPb_DE>vdgE#D>B74u%m?JHNy?j^kfcR9YN-i~R*D2!9N>?CKIwn0#Qz;6 z%5OEP|6)!24-iS)b7g@Oz19gDSYMe&3YyzFmqw$TE9h>&p%!WByw=J{=Ufx4>^+*U z$gXExn@co!O9+`3V~j~vC!$qtykq95^&=mIq{^=+V=UATDIZV_*SG>@@o<^3UNxT@ z-)3O+98=tLz}|bxruTvNJ&p0q^5P8M8U`g5w67<7=3`mCD2gZHUdBZUsC(i zk7^&_hvy+3c7v)iW1v)TH;qqC4)5tGi8JC={xI)MbtL+S z+QQz^AahA5l^Jz2lCq;!i5VQZ^ z-Ca$GZ+@SbaJHqp!KK=xOu}}8cR4eO(uY@r0kaqzCTnMO^Lq9JSB|dp(Jk@(CPSHP zdfi@eh87sM=a|83&HTS3bhv~y9T?A02P{CCcA0H>FmJip!3P>lM(L`AzWO}YO3^n& z&foTz{|_ODfSb&|n{K7{AK#kfuXS)Ut{E$J2j-*wzDWxh`>rDnAQ^_IRWxR zO~Km682#&Npo8RIXPs+r5?K8OVe{r^XgTQ~gp##iun=|zG?}xPLin>J>#oFd6^^)Y z?P&AfB9TdqeVmEfA$4M1Z5OQd_osmzJM(nE94xnTxf3n0y#O1J4{M-ptxxK{G@puf z&UQKbhc*{Te)0AJEOKmJ`qk8eP^JJS9;tk;upXePEp87{H&GJ?W$-3Pj1ES!xiPJ6 z!r&C~97>IYaSfXvt+RdqND1-w(x|ZXL zvE}vl8nnT6HtNqlv3ZT2Y zO3;LP-c&Bm$I<9$Kr47gVSKKB@J^|0qsY7srsYG;Zg~!DJqBnGUcs)$_iX7|d{q4J zFuLR`sr}i@smLE=c};ODT+sG(V)3DOltrLtnxbHQdCjQ9<3&ay>)u?4&y=S2a-6IG z1K{}1U<>S714UsN@pVxt(n(q=x=>xVK3&OI+~d^qZ3k+P?IPH3rmI%#f?|43X1sy% zHHXH>ZdPj#^#g|Rs@Y1#-m zkW`VGGWL&AI1cB-lc1ucz^A&yS}faeqt3{_bN{8%{C|CaGp?PA+ggDCuixwc;{Nj1 zmH|9NjASxElS58`)%13nR6c}q(V*D)5RiNk8eP{GUz>EoAWEEsK4TN|gNL4wON~dD zc&`Az*#S-yM?}?sK}q@Nxd4iRF-6yacX=7Hw29hUm~>;HGF;pI8_<+g7=iW_RZWQ3 zIWb^(WaK)-&+^W@8#YkvZOyy2n6x2=W_!nxxPktW*(#iow zOdsm2aj~UZG+L#vyb2-iCkaV~!%4dufDY?~iA9~Dv^~p44u*|19AU1f${b(Ch&Y;A z6u~!vhS#8W#O#SrJ=FgZRm0#dDgGwwf8TR)+8(&S3U}9tdKe5d0i)c7$QZ@NPCAtb zPzek+r(WDCTfHKC@G_thxRi#VX3b$86fqww7bHyxv1PayvB529P6%F?`D^3Hi!&*g zzVy5Z2d$w6FzFKjXbPdx(X~ID8TonhL2_AHJ07E1@>~k0P=f-_YaSq~RCuU^a*w_} z2t!&)51`jN06{$KvpU5s`cH`YA0V?_B#T}jcA0ia`&9H5hOb7fo$Ki=h^zJbs{N83wvWgiBr(RF0mqb#LCJ1w0D)0Bcp8jt&tQDY@Q-67M`18% z2TH7J@dCxxps?*xa4#W9dWe-^;V#sU6MzWb6Jtf=@!ZQ~P&UE)I(Popn~*ft@nQ4# z)!`Ayld!!2^CCpSw|A6l6-gaFaI)JR{_nj~GsCK_2gfUITOyZ;H^E#X3RSxZGNuF! zwXR{R33l#ILfbWE4-y;}B}Z>moqub7v{etHEDvFCJ#|g{4O7CB5vKj15=PdWX0HO| zo{9_`d^wngg7puZ8yVgka1@tZ6W@Sg)9KFqCz0t*3n+*V=xCkQKf+ud$JhGAf{j;T zDVDI^X<>2;H!HLD`?S0X%KCB+Ou!Mx)X6c@r+PAtf)!m5PEgVHX%XgSnAy~x>tQdh zOTYA-1fjsRRF?*>3_Bn4XzBcj3<-@fKbxIB_O}alWq>qq;}^Vde4Tr|Cz1z5-Z(Ah zH2fI*gn)9}$=b@-cXe3*7fy`U=g42OeQXQ5DyR(FWX>r#mLk4+S{b(qE$stE4d+)fR zg2T7=kXPH$dr^Pg&n!JqD-eJ```7fJ8m{RM0UUa0W~FC@mrwz(NBdH_up1Ule_QZ? zd?eD=;FLI&{twjr`m_9ffOMFEO+y06i3c7)MU?i^@#Zg|LQ$eiH6A}ln-Y=~+u4p| zwBvMIDL2ou=(56FYgvJ6gy*ES{^KtGC*DWgZb3R8mI}Aakr{l>^4G9;kOfobjp~u{ z18F%IiMeNT-eteZ-T~X(%91I|T&HA#Qq~QOMys`b#z7Hg?qFnnG>XQ4s8RTsUj`v) zn*FesnBb&jBvf3cF&)>&s;#>`mtR`_wh7$N?C1;}slJ1(?)9G;O|(`Luch8jUDYHom{D>-s*}n|Rj<3mM0hoKb|19a7g=jNfxdL}Qew&8V|LTY zr9wuZ9a}J&<`&6Wy1>e$m$sa0>lisBRTmg73tFl-Ph#Jq`B0l^YFKqk9>>Vo2cFd1 z857{>FcRKJ%*jFa0LN&S+~6u=|DC&VYxpNd&|*JZI;IXpq9-4;yNGZ2f6Si9&OR=V zgxLPE4e!A=VVspWbLZ;F;2VXRaqn-sQle{2h3Re+9fe=|AS|u4i`S0XorZ{_ywR6u13<*zURAM6=_A`8(Rtc>?tYc=byTsV+r-yyhM3;7{&Gq7ayN z{P+FkcL|EyXA!S;kvESs;zyU(&&^W%vEl3U%jR$rO&<)!YK#MZzn?DP(#`{r&uj)c z=0@^Z2cA3cA~#`Q)=Il%e?HMO`cr}YH#QHZO}E=^d5vp^%#m8Yy*NA3-B zBVjVXESyjapNjIBzMF*(RTE9eEi&#B$L+vBGNrix*W8~nm~e6Dxnc zQ*x5B2`P6I58Ohtxu1U zw@evbqR{P#4&UEP51#~_GlrU-((kFZ#Cwij9bCe-9cD^&v?&4!k-XA;M8;l9Y*Av?RCj}yI)y-w$>sQuWtG$bl=-WQ!evPKtT4L-a#5{y~AzO1%Qwq-A*C0VJj~L?+ol2(K*7gu4 zw$D2pE?bfvH+%8u6_esbEPUI`OTF%Rk)joaF%h+2@75O`);6p($@7PXOFxBdCX8K| zW9x@jVF;8x4wubDft%>c{HXZ#OALJ58ObSWyDggOJ~2OGsJz407bSA>4HfGna*Ve# za0&7vDYq8;=KXq6zdA?H&1I@A9)kc8LBl{@k}RwI4ly2)QW{b{tcprX>oHaJT(b#m zXk58zslS%Wgki3hp8e+H;MW@?AEthPpQ)crKbq$C>Q~9@x)!frvTGi)YmY}}H@;7P zJDDpc7ET;2FHd-yxvOkrXJGLJ2?yKhl&9(@?d+I-0GacUs#*s=x;mr4 z<`i*m;P)8`6hg~Gpmvv%%!lwf2iEIfP+*+{&{8QHFp<^ zV6Lro+tXpL7vf9o?|$sX(%XH(@@I%RwD=F^{=)qc=}d*;7EH1}rJpH=`0KU68P>hQ z8rhlfk-ecNbaZ~_C~@nSwX=jK9$p~R7Ez}goxa3|$KhK<6g{noY}D8o_uvZPdQbO6 zZ%409FX6`jtFbE&hq8U!3~z>tnGj`ZjF9ZDBimr8n24!FD6}EMSi+R0!C0EeT1}P; zsVI^ygvOFWwh%>x8cWus$ag*Ue(&%74Si@NSQRvJhzAkkT;K-wv?J%A12-cOoNC4aY83$)CfU3# z>JTrf>i1M~6(FT=gPE3yZTpGG7@`t2v&KEUA!+ywibGD^aLu!Rr7_X}{5ew6HxGzL zV-RDk`Lab0%TNn>%skWmYg+EX>lq_r&5q-neWb8kWRWKjZUdn_A2yo~uss_EBfPKA z-#)b7?)t7U2b2SisR10t(R&;WH+IXWKa0kzhy=WfD0~phxULfXK?CF=^zhFt4X1GG z0WI&(1N1KdM@RbF02G%F)1>e?)UeT?^~Ar`vM>{ebFdNMYy?9Ba{9LVgsG*xFR?O) zEOjZ+qW86}Yq=FJ7NY*A&mto2F2?IadpFEJR5m)Hg6bh;UFw>vS*_;193iwxwfNA& zHFSc;pAUB`#wQZF)fC^0{s^yipYMOuegQ~S$AI> z*h~|UITKVSE10p)_S0ss2v?L!GBQEJU-j*s>!TQ_(RiaQ@nt6(5T^5b0QD!En#6G~ zHhT?l)GMqv&2$ZX4H;Rw`e+yk8JR_Rj4;a6i~P*{ zizA~NIK%xg1&6-byobzKE@<)Hi@K$=q3{G!G{Nv8^mohhImFEwYCQD7`?w>i2&C9M zSRFYb#5jaSwhQu8y}(YH04l~dTfC%o(gfnbHd=Wk$1-z}2K*i08h(Y6O6>`<1bqtf zS|@3@#y~IR1|xx5a{}lLK4z|E;!8CN3-Cv8F(Mi0{=L@=!hqZxVf8z^uxDpnH z`VK6_$H89vXWCKtItCh+iWdJ;%tx#{_}gF*_BU(KzHVS&SBwR8UJoS|*ZN)cI3KS0 zDJ483yRrwSbyN7YcMRfdH2bB7Q3_-{pPR*ii=eA-t*8~Dcm~Lyg^1w@)D$4y)CnxA zfOO@g4#^)RZsU-Q^E;j&b@Wa@_=gX(#WK0Uhgtns%9Fdlz`Vm6$b`4jYp;}pTx1*) zYPp2HG1CdNkYMHfkVPNAIDa@0$dzz2Jg^*SF08Hq{F5?j6 z2V~wIU5^+LxIyx+Sw?=nq&8iSuf`j4E1osi)2fGI@;pUq7W^(429lD#K+cS8$U`2RHmqb-BhHAE!pKe<{8@ytn~?gabpW#`}_GRy5e`EL#8oVB{mG{ zcOPHlH+rg6$a&d&P97~t1IHhv1onz78N4KHs>AY;N+7WF`3XJ0Feqt(fcrfW;#gDX z8pO{Cikj!T6}*%ejlonU@Pjt-on3wO>Ql$X(v2sH`D5YIXppTU;m(U9Y(;^mex)~dcFWDGre*w>bw43Y6Y@$A($dDK@-=mn#f$I;P3NBcIt=36kW6x7UG#OI8i#N!<92O9FO+lO;! zI`45X$yLP1Enu<;c1zR7ELe$~m$_HKBEeQ?^C;mS;l^G`Px^zacaL0?J4lygDwrJt z>gfA6UGwI^QS_dq-UvY{4u@=AR(IeQL>f=ew$|7QXUApFds>aQqq(agZqQ}4$&1+>wxUfJ>l6@o=JP&J>-1RcDs2B^o5=E{k^t$ z7wmB)@vbD4zSeY+wFy|=c}Eg6X_Ayd(&Hh?A;OE;v}qG%kNLWE>7oJ_rtpL04=0sG zb)+^1^{(FX93@$gN!Ucg4ARs;8m@7>r*@@LX%oF<#e?HnRjTF+=Zgy~&t7UYX<6E- zhXvDfpo-l-TnIrk>(|6>j1?icV}B)t2xj7zvylwaW0?<_quPuiDYS0ieo}f+&|cdo zkkWn~SpZpZf@hd;gYcsE=1;e%Qnre9Hc-Dy*iZW$eS36tl*cD-dBLyxO6-jW8ar35 z_*ww5Gq?LKp99J4L;M7TIOu50mOz~ZeNOlgho3StSJY}So*yPEI0Zaft7=q60BAr7 zp0yfKT{v0EvB97EqPmJM^$Pe_DPR=pz3tR10dH7(>XeFT2oqMP;a5w@KEO1tCpVGHsNh!QPn{er=K)C8B*9j@I;*6|SW94)U*tbL+dmpHG|`SUvO)@J9t;}h2R zZEKiH^*faH=O4vDn0AUjSBYlF5?K&5wF`%>?WbPh&N!g6<+jM~^?Z*oe76%W+9*1t zvqB(r4!@o$bjS-&HsJvYG!cb*p(l(m_v2_eW>S&NL7%~}Ak-2n*s%i`*HoZsRj!%un7 z0}-Y)w`NwE7>NkZD)0v}7mhGJSh5{g*l~o{(SXQwCd*qoGl+5g4H_!jrg#Mv{s#NF z`a=uB0Ay5=w=y_zF%*XX4o|}Km=AdTLH8^&>YTuF1m4i@ zJ8^>4u6rjug-7gy8%`VUcdJ1jVQ7BQD4mR+>P&ocrlkmq;ItKi8`G>-7VW8gzf8+Q zN!O#}&&k^?Q=sVp1?me$I^uU`(VYuMj`heVR3YWRk@F?s6}9D+j@)=E*^YQ~1L5Yq zmD#s1?Ft$6grfiQo&$^`a7)-UQ-}(WD~ql~5TS1L%VZ@xjJA-T!&# z4T1*`9PJVdVPK}7Wf_LA@vQN#3g-4QmEEQ%V947T0zKxHk~zb)r~y5wd22Kghe~xt zyhqC}0X-=B*hWVB#%N*zKXCW!zd>veC8c}qfMJhVD2z*)dz>41j0N2A8?~VSMlIfX zB1vdc99Je0QJ8?r?1;r0bB)?yxMPjHg(8E9fjdk#btbKn$u5F!{RbFaED^E)+Fc3i^P4ZR6-+-y66t6}vfr#y0n9F0kwk+?1f7;N-J8LND5Ed*8hqKm zqJU1Vp~0(;kJIb; z;1BU{yS*=jMw1Ut?C$e0gcb8eU)PI4Z9Bx;5;j|##I1+7uH|z;ocX#Tn0CHimotZ7 z=^p@Tc`;c0yo2MyTNWulsB8A5CaWF)Ty+%G72cuRJI#xfwcyA+7p9Oez?oh|*a4EG zGNgR&)8R8Z0dtRmxqIrSjYY4_KF>t#cL=%*;QYD1=-V~hm(zgDk}lhIJX7|+ygx<$ zd~;$xnthE3C!{QNz{>K18#Fxck}uSNDF!h0jD|R$!};@Vtsr3Qp5t`nm?caf&ee8^ ziGIC{aGW+BM&02#g;b`M0O!<+k|CyVtC84-Kmy)COvUCT9Pk!E&7M4;Nxv0@@*ORv z=8FfXlF0%NxI!bLYONSUNyVmWp)&yBYM! zqbYcgNYRksScDnSb)$u>0i7W98{d>SEFfGp#6lCo;Rl6_Kd3Y?e_&~q!*LvR>fUbD6JvoCcU9iXSMhQDa z2iA#gIH>yuiZzYBe^!iis#%Q8ICxKJxxPsc5#EX3-njL`y_3MX_iEk}8Y36T%Yl$+ z$Prq0cX343ap)a`@)h^iTLbqNTczA2tYEO%X?5JECPBM>cx;%_PHujz|4EiD9x?1Q zsDC02xDTT43e$u3@oIQ!?u%fAut$Fh9772im0rV*QEdWV?6u)?rV9zX25uwO)_$M4 zCmwHg&sxKCYTexgX?49NC}!7WB6Zrnev}7AU4XIw%)eCz6($b}q_Z_;m9Pz1pmE_C zH!z~}3?liT>iG$>K;O`)fO@dNI>P$d8|V|u*x$F0SF+3C1io_V*bwfLrzO@M47zd& z*=te4+1S=7!$?_=nK1bog7VTz$XlYOO=KL~fg zrISHr=s5853ooRK=YY=QBe+Xr;7I&#K@Gn7>m@Y^SaDa7N*Z}7)?0aPR#5u|i12;s0+?z&{pnHd5(;b3Dp-RY555(L)&DPr zfl_bfoq_WyB}_DhWtJ3+&H7OKyh4Gz_sYg$mUf>$F9+Nl#~|n(EB~>NSD~w>_1IIF z!?l`vkH{$ng-zRZU-hP{&vUdFH=r;e0w;QIuy!|J)-;F>urWvT5aQM6EBlv#i{!03 z4k92HvFelfGFulFBWtB7g3!kitjX?E5O2&F>dm_6mS{vr6@>isq$y5eLYk zP@LkuNGi-61@f}#H-?joqo-uf#HSENIu6Bb<6&=`XLY0%>}VEe8y|2f6K}X`8IoZb zQMQM|R_)SH!5dr74nuLDYm)x4k(rlBTbUbcZd?OPBWczLMAxJ$m^A1wclrWlE0?+B z;DC*Kx{jleMNG;t57+Hvjhq8U`zSL+T8uU4GHZ*&zzbf-n@fva^uU-4U={Yn?n6g% z(wLH}?!u~5>LtUpeUOGX&S`aB;)OW!z`$LlQ&@&9H-!El-kLCsN!DOs%`%KY&opB* z(CS}_Yo<@|4K_SCmqiIUe0B?=_eR_^N_iYJhJXq3JDHRIZLEB30b0yu+lEaVCbrsB z-jJ|4d`>LPsZlqMa7UZ;!bkI{@u`>64kpW6%)iYZT7fjlc>@$p57dc+1#&x>rxx?LJe`sR<V6H!7gmW$U* zC4cuA!FYYym7HzA-R@iuJ2vmUOXZhcZ1aiHeyc?Bb{)+$#pVuH#dHrn?Ha%D;q=qH z?;EJa6Nh;imG_^l`4y3lk%icCM_c=y0b~FgRXyjYRo0zwPUed|Dv()pEoiTl&!I}y zv`(KWQJ&lJnfA6H9!vZ>lX#R@V)3u7KPxS%Q4$XgArSS0VO;uzVh(%2HuLBxNBy<-ddUl+Om#wGtWAPy4#8zY?$V*a@Tzd)XZ?>|i<^5T&! z|GM^c+`lhEYDwtt_WW)Y2?>%nXX)$z`{KS7j`V+;#EoU}!dkeGd^z;r7ZHf{pALcH e^Z)FqUqWT!_EA>~elBpqzx_sLq&$NYq5lJn%D4Rh From bec59fa7bf92d9aab4c90831a93da483528e47f9 Mon Sep 17 00:00:00 2001 From: Jos Koetsier Date: Tue, 29 Sep 2026 12:04:11 +0100 Subject: [PATCH 2/2] Update documentation to reflect transition from Elasticsearch to OpenSearch --- .ruby-version | 2 +- config/tech-docs.yml | 7 +++- ...-to-an-elasticsearch-document-type.html.md | 41 ------------------- ...eld-to-an-opensearch-document-type.html.md | 41 +++++++++++++++++++ ...l.md => opensearch-cluster-health.html.md} | 26 ++++++------ source/manual/backups.html.md | 10 ++--- source/manual/databases.html.md | 4 +- ....md => debug-issues-in-opensearch.html.md} | 8 ++-- source/manual/docs-style-guide.html.md | 4 +- .../fix-out-of-date-search-indices.html.md | 10 ++--- source/manual/govuk-env-sync.html.md | 2 +- source/manual/govuk-search.html.md | 2 +- .../investigate-when-search-is-down.html.md | 2 +- source/manual/kibana.html.md | 2 +- ...-document-type-available-to-search.html.md | 14 +++---- .../manual/manage-opensearch-on-aws.html.md | 2 +- ...dumps.html.md => opensearch-dumps.html.md} | 22 +++++----- ....md.erb => reindex-opensearch.html.md.erb} | 28 ++++++------- 18 files changed, 114 insertions(+), 113 deletions(-) delete mode 100644 source/manual/add-a-new-field-to-an-elasticsearch-document-type.html.md create mode 100644 source/manual/add-a-new-field-to-an-opensearch-document-type.html.md rename source/manual/alerts/{elasticsearch-cluster-health.html.md => opensearch-cluster-health.html.md} (74%) rename source/manual/{debug-issues-in-elasticsearch.html.md => debug-issues-in-opensearch.html.md} (87%) rename source/manual/{elasticsearch-dumps.html.md => opensearch-dumps.html.md} (69%) rename source/manual/{reindex-elasticsearch.html.md.erb => reindex-opensearch.html.md.erb} (73%) diff --git a/.ruby-version b/.ruby-version index 3b47f2e4f86..47b322c971c 100644 --- a/.ruby-version +++ b/.ruby-version @@ -1 +1 @@ -3.3.9 +3.4.1 diff --git a/config/tech-docs.yml b/config/tech-docs.yml index 3add05b09f6..28bfea7a73a 100644 --- a/config/tech-docs.yml +++ b/config/tech-docs.yml @@ -155,7 +155,12 @@ redirects: /manual/data-gov-uk-supporting-ckan.html: /manual/data-gov-uk-2nd-line.html /manual/data-sources-for-transition.html: /manual/transition-architecture.html /manual/deploying.html: /manual/development-pipeline.html - /manual/elasticsearch.html: /manual/elasticsearch-dumps.html + /manual/add-a-new-field-to-an-opensearch-document-type.html: /manual/add-a-new-field-to-an-opensearch-document-type.html + /manual/alerts/opensearch-cluster-health.html: /manual/alerts/opensearch-cluster-health.html + /manual/debug-issues-in-opensearch.html: /manual/debug-issues-in-opensearch.html + /manual/opensearch-dumps.html: /manual/opensearch-dumps.html + /manual/opensearch.html: /manual/opensearch-dumps.html + /manual/reindex-opensearch.html: /manual/reindex-opensearch.html /manual/emergency-publishing-redis.html: /manual/emergency-publishing.html /manual/error-reporting.html: /manual/sentry.html /manual/fastly-error-rate.html: /manual/alerts/fastly-error-rate.html diff --git a/source/manual/add-a-new-field-to-an-elasticsearch-document-type.html.md b/source/manual/add-a-new-field-to-an-elasticsearch-document-type.html.md deleted file mode 100644 index bb303617655..00000000000 --- a/source/manual/add-a-new-field-to-an-elasticsearch-document-type.html.md +++ /dev/null @@ -1,41 +0,0 @@ ---- -owner_slack: "#govuk-search" -title: Add a new field to an elasticsearch document type -parent: "/manual.html" -layout: manual_layout -section: Search on GOV.UK -related_repos: [search-api] ---- - -## The elasticsearch schema - -`config/schema` contains JSON files that together define a schema for documents in Search API. This is described in more detail in the -[schema documentation][schema-documentation]. - -When adding a new field, first you need to decide which field type to use. -`field_types.json` defines common elasticsearch configuration that we reuse for multiple fields having the same type. - -The type you use affects whether the field is [analysed][] by elasticsearch and whether you can use it in [filters][] and [aggregates][]. - -Add your new field to `field_definitions.json`. - -If your field should be valid for any kind of document, you can add it to `base_elasticsearch_type.json`. Otherwise, add it to the appropriate JSON file under `elasticsearch_types`. - -## Integration testing - -The easiest way to test the new fields is to write an integration test for it. These tests run against a development Elasticsearch cluster, and create new search indices each test run. - -## Updating Search API schema indexes on all environments - -In order for the new field to work as expected, you will need to reindex elasticsearch. Follow the guidance on [how to reindex elasticsearch][reindex-guide]. - -If you consider the change low risk and are only adding new fields for which content doesn't yet exist, you can run the `search:update_schema` [task][update-schema-task]. -This task will attempt to update the Elasticsearch index schema in place without requiring a re-index. -If you have made any changes which affect existing fields, Elasticsearch will reject the change and a full re-index will be required. - -[schema-documentation]: https://docs.publishing.service.gov.uk/repos/search-api/schemas.html -[analysed]: https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping-analysis.html -[filters]: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/query-filter-context.html -[aggregates]: https://www.elastic.co/guide/en/elasticsearch/reference/6.8/search-aggregations.html -[reindex-guide]: https://docs.publishing.service.gov.uk/manual/reindex-elasticsearch.html -[update-schema-task]: https://github.com/alphagov/search-api/blob/main/lib/tasks/indices.rake#L131-L149 diff --git a/source/manual/add-a-new-field-to-an-opensearch-document-type.html.md b/source/manual/add-a-new-field-to-an-opensearch-document-type.html.md new file mode 100644 index 00000000000..a7239051a23 --- /dev/null +++ b/source/manual/add-a-new-field-to-an-opensearch-document-type.html.md @@ -0,0 +1,41 @@ +--- +owner_slack: "#govuk-search" +title: Add a new field to an OpenSearch document type +parent: "/manual.html" +layout: manual_layout +section: Search on GOV.UK +related_repos: [search-api] +--- + +## The OpenSearch schema + +`config/schema` contains JSON files that together define a schema for documents in Search API. This is described in more detail in the +[schema documentation][schema-documentation]. + +When adding a new field, first you need to decide which field type to use. +`field_types.json` defines common OpenSearch configuration that we reuse for multiple fields having the same type. + +The type you use affects whether the field is [analysed][] by OpenSearch and whether you can use it in [filters][] and [aggregates][]. + +Add your new field to `field_definitions.json`. + +If your field should be valid for any kind of document, you can add it to `base_opensearch_type.json`. Otherwise, add it to the appropriate JSON file under `elasticsearch_types`. + +## Integration testing + +The easiest way to test the new fields is to write an integration test for it. These tests run against a development OpenSearch cluster, and create new search indices each test run. + +## Updating Search API schema indexes on all environments + +In order for the new field to work as expected, you will need to reindex OpenSearch. Follow the guidance on [how to reindex OpenSearch][reindex-guide]. + +If you consider the change low risk and are only adding new fields for which content doesn't yet exist, you can run the `search:update_schema` [task][update-schema-task]. +This task will attempt to update the OpenSearch index schema in place without requiring a re-index. +If you have made any changes which affect existing fields, OpenSearch will reject the change and a full re-index will be required. + +[schema-documentation]: https://docs.publishing.service.gov.uk/repos/search-api/schemas.html +[analysed]: https://docs.opensearch.org/latest/analyzers/ +[filters]: https://docs.opensearch.org/latest/query-dsl/ +[aggregates]: https://docs.opensearch.org/latest/aggregations/ +[reindex-guide]: https://docs.publishing.service.gov.uk/manual/reindex-opensearch.html +[update-schema-task]: https://github.com/alphagov/search-api/blob/main/lib/tasks/indices.rake#L131-L149 diff --git a/source/manual/alerts/elasticsearch-cluster-health.html.md b/source/manual/alerts/opensearch-cluster-health.html.md similarity index 74% rename from source/manual/alerts/elasticsearch-cluster-health.html.md rename to source/manual/alerts/opensearch-cluster-health.html.md index dff3dcdb5a9..07f29a3c7e2 100644 --- a/source/manual/alerts/elasticsearch-cluster-health.html.md +++ b/source/manual/alerts/opensearch-cluster-health.html.md @@ -1,12 +1,12 @@ --- owner_slack: "#govuk-searchandnav" -title: Elasticsearch cluster health +title: OpenSearch cluster health parent: "/manual.html" layout: manual_layout section: Icinga alerts --- -Elasticsearch reports cluster health as one of three possible states, based on +OpenSearch reports cluster health as one of three possible states, based on the state of its [primary and replica shards][primary-and-replica-shards]. - `green` - all primary and secondary (replica) shards are allocated. There are @@ -18,17 +18,17 @@ the state of its [primary and replica shards][primary-and-replica-shards]. entire cluster is cold started, before it's initially allocated the primary shards. If it happens at other times this may be a sign of data loss. -[primary-and-replica-shards]: https://www.elastic.co/guide/en/elasticsearch/reference/2.4/_basic_concepts.html#_shards_amp_replicas +[primary-and-replica-shards]: https://docs.opensearch.org/latest/api-reference/cluster-api/cluster-health/ More [comprehensive documentation on cluster health][cluster-health-endpoint] -can be found in the Elasticsearch documentation. +can be found in the OpenSearch documentation. Make sure you understand the consequences of the problem before jumping to a solution. Icinga uses the `check_elasticsearch_aws` check from [nagios-plugins][] to -monitor the health of the AWS managed Elasticsearch cluster. This plugin uses -various endpoints of the Elasticsearch API, but also extrapolates additional +monitor the health of the AWS managed OpenSearch cluster. This plugin uses +various endpoints of the OpenSearch API, but also extrapolates additional information to help you diagnose any problems. [nagios-plugins]: https://github.com/alphagov/nagios-plugins/ @@ -43,13 +43,13 @@ There are tabs for 'Cluster health' and 'Instance health'. The graphs in the console link to AWS Cloudwatch, where historic metrics can be viewed over custom time periods. -#### Use the Elasticsearch API +#### Use the OpenSearch API -An alternative to using the dashboard is accessing the Elasticsearch health API +An alternative to using the dashboard is accessing the OpenSearch health API yourself. Start with the [`/_cluster/health` endpoint][cluster-health-endpoint] and go from there. -[cluster-health-endpoint]: http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/cluster-health.html +[cluster-health-endpoint]: https://docs.opensearch.org/latest/api-reference/cluster-api/cluster-health/ Response JSON from the `/_cluster/health` endpoint looks like: @@ -68,14 +68,14 @@ Response JSON from the `/_cluster/health` endpoint looks like: } ``` -A tunnel to Elasticsearch in a specific environment (e.g staging) can be created +A tunnel to OpenSearch in a specific environment (e.g staging) can be created using the following: ``` -gds govuk connect ssh --environment staging search -- -N -L 9200:elasticsearch6:80 +gds govuk connect ssh --environment staging search -- -N -L 9200:selasticsearch6:80 ``` -Elasticsearch will then be available at . +OpenSearch will then be available at . #### Logging @@ -85,7 +85,7 @@ Access to logs is detailed in the [logging documentation](/manual/logging.html#e GOV.UK have a Enterprise level support plan with AWS for staging and production. Since we are using a managed service, AWS should be the first point -of contact for fixing issues with the Elasticsearch cluster. They can be +of contact for fixing issues with the OpenSearch cluster. They can be contacted by telephone, live chat or support request. Response times are: diff --git a/source/manual/backups.html.md b/source/manual/backups.html.md index 53261ebef8a..772296a1bef 100644 --- a/source/manual/backups.html.md +++ b/source/manual/backups.html.md @@ -12,7 +12,7 @@ This document describes the backup policies and strategies for GOV.UK's producti > For restore playbooks, see: > > - [Restore a database in Amazon RDS](howto-backup-and-restore-in-aws-rds.html) -> - [Restore Elasticsearch indices from snapshots](elasticsearch-dumps.html) +> - [Restore OpenSearch indices from snapshots](opensearch-dumps.html) ## Databases in Amazon RDS and DocumentDB @@ -74,14 +74,14 @@ These buckets have: - versioning, so that we can restore previous or deleted object versions - 120-day timelock on the replica (in governance mode, so that we can still delete an object if, for example, a department publishes private information by mistake) -## Elasticsearch indices in Amazon OpenSearch +## OpenSearch indices in Amazon OpenSearch | Strategy | Retention | Recovery point objective (RPO) | Recovery time objective (RTO) | | --- | --- | --- | --- | | Incremental snapshots | 14 days | 1 hour | 1 working day (best effort) | -GOV.UK does not store any original data in Elasticsearch, but regenerating the full index takes a long time. +GOV.UK does not store any original data in OpenSearch, but regenerating the full index takes a long time. -The Search feature on GOV.UK no longer uses Elasticsearch, but some other features of the website still rely on Elasticsearch indices for legacy reasons. +The Search feature on GOV.UK no longer uses OpenSearch, but some other features of the website still rely on OpenSearch indices for legacy reasons. -Amazon OpenSearch Service [takes hourly snapshots](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-snapshots.html#managedomains-snapshot-restore) of Elasticsearch indices as standard. We can [restore Elasticsearch indices from snapshots](elasticsearch-dumps.html) relatively quickly compared to a full reindex. +Amazon OpenSearch Service [takes hourly snapshots](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-snapshots.html#managedomains-snapshot-restore) of OpenSearch indices as standard. We can [restore OpenSearch indices from snapshots](opensearch-dumps.html) relatively quickly compared to a full reindex. diff --git a/source/manual/databases.html.md b/source/manual/databases.html.md index 837df91560b..95eb3ea34e6 100644 --- a/source/manual/databases.html.md +++ b/source/manual/databases.html.md @@ -12,7 +12,7 @@ GOV.UK uses mostly PostgreSQL and some MySQL for apps that require a relational GOV.UK uses MongoDB or DocumentDB for apps that require a document database. Whilst there are some [big differences between the two](https://www.mongodb.com/atlas-vs-amazon-documentdb), they're broadly compatible, and we tend to use the term "Mongo" to apply to both. -Finally, GOV.UK uses an ElasticSearch database for search. +Finally, GOV.UK uses an OpenSearch database for search. ## Hosting @@ -22,7 +22,7 @@ Each Postgres and MySQL database runs in its own RDS instance. Whilst RDS instan Mongo databases are hosted either in DocumentDB clusters (managed by AWS) or MongoDB clusters (managed by us on self-hosted EC2 instances). On production, there is currently one DocumentDB cluster for Licensify and one 'shared' DocumentDB cluster, each with three instances. There is also one Mongo cluster of three EC2s. We have agreed that [we should move apps from MongoDB to DocumentDB](/repos/govuk-aws/architecture/decisions/0038-mongo_replacement_by_documentdb.html). -ElasticSearch is hosted in [AWS's OpenSearch service](https://eu-west-1.console.aws.amazon.com/esv3/home?region=eu-west-1#opensearch/domains). It has [two types of node](https://github.com/alphagov/govuk-aws/blob/6b5f78824bb14f5f6aaa7f7d269915b7831a13c3/terraform/projects/app-elasticsearch6/main.tf#L186-L193) - "master" and "data" (instance). +OpenSearch is hosted in [AWS's OpenSearch service](https://eu-west-1.console.aws.amazon.com/aos/home?region=eu-west-1#opensearch/dashboard). It has [two types of node](https://github.com/alphagov/govuk-infrastructure/blob/a4e63cec8ebf07116c2cf4d49165c66601ed37f8/terraform/variables/production/search-opensearch.tfvars#L8-L14) - "master" and "data" (instance). ## DB admin diff --git a/source/manual/debug-issues-in-elasticsearch.html.md b/source/manual/debug-issues-in-opensearch.html.md similarity index 87% rename from source/manual/debug-issues-in-elasticsearch.html.md rename to source/manual/debug-issues-in-opensearch.html.md index 91af6718693..e90a82db7b5 100644 --- a/source/manual/debug-issues-in-elasticsearch.html.md +++ b/source/manual/debug-issues-in-opensearch.html.md @@ -1,6 +1,6 @@ --- owner_slack: "#govuk-search" -title: Debug issues in elasticsearch +title: Debug issues in OpenSearch parent: "/manual.html" layout: manual_layout section: Search on GOV.UK @@ -15,14 +15,14 @@ switch between the two using the [GOV.UK browser extension](https://github.com/a You can compare the data returned with the relevant publishing app or content store to check if it's up to date. An empty response means no documents match the given query. -## Check the document is in elasticsearch +## Check the document is in OpenSearch If the document is missing from the search API, you can check the search index itself to -see if it is present and has the expected fields, by sending a request to elasticsearch +see if it is present and has the expected fields, by sending a request to OpenSearch [from a shell][open-a-shell] in `search-api`: ``` -curl -X GET "$ELASTICSEARCH_URI/govuk/_search?pretty" -H "content-type: application/json" -d " +curl -X GET "$OPENSEARCH_URI/govuk/_search?pretty" -H "content-type: application/json" -d " { \"query\": { \"match\": { diff --git a/source/manual/docs-style-guide.html.md b/source/manual/docs-style-guide.html.md index 26142d8385b..8bd851ae50d 100644 --- a/source/manual/docs-style-guide.html.md +++ b/source/manual/docs-style-guide.html.md @@ -54,13 +54,13 @@ Good example: > Title: Reboot a machine > -> Subheadings: Redis, MongoDB, Elasticsearch +> Subheadings: Redis, MongoDB, OpenSearch Bad example: > Title: Rebooting machines > -> Subheadings: Rebooting Redis machines, Rebooting MongoDB machines, Rebooting Elasticsearch machines. +> Subheadings: Rebooting Redis machines, Rebooting MongoDB machines, Rebooting OpenSearch machines. ## Writing style diff --git a/source/manual/fix-out-of-date-search-indices.html.md b/source/manual/fix-out-of-date-search-indices.html.md index a844c76f634..1efd6e9a84f 100644 --- a/source/manual/fix-out-of-date-search-indices.html.md +++ b/source/manual/fix-out-of-date-search-indices.html.md @@ -9,7 +9,7 @@ related_repos: [search-api] ## `govuk` index -GOV.UK content in [Search API](/repos/search-api.html) is stored in the `govuk` index in Elasticsearch. +GOV.UK content in [Search API](/repos/search-api.html) is stored in the `govuk` index in OpenSearch. This is populated from the [Publishing API message queue][queue]. This can get out of sync with publishing API, which affects any part of the site using it, including navigation pages and related links. This can happen after [restoring a backup][restore-backups] or [reindexing search][reindex-search]. @@ -36,7 +36,7 @@ updates this index. To update it manually, you can run the [associated rake task ## Environment syncs -There are cron jobs that [synchronise elasticsearch][sync-job] environments. Staging is synced with production every night, and integration is synced with staging on a Monday morning. +There are cron jobs that [synchronise OpenSearch][sync-job] environments. Staging is synced with production every night, and integration is synced with staging on a Monday morning. These jobs work in sequence to take a snapshot of a higher level environment (e.g. production) and then restore the snapshot in the lower level environment (e.g. staging), before the snapshot for that environment is taken. If documents that are published or unpublished in production are not reflected in staging after 1 day or in integration after 1 week, that @@ -55,12 +55,12 @@ may wipe out changes that other developers are testing. For more information on environment syncs across GOV.UK see https://docs.publishing.service.gov.uk/manual/govuk-env-sync.html -[restore-backups]: /manual/elasticsearch-dumps.html -[reindex-search]: /manual/reindex-elasticsearch.html +[restore-backups]: /manual/opensearch-dumps.html +[reindex-search]: /manual/reindex-opensearch.html [queue]: https://github.com/alphagov/search-api/blob/main/docs/new-indexing-process.md [popularity-docs]: https://docs.publishing.service.gov.uk/repos/search-api/updating_popularity.html [popularity-job]: https://github.com/alphagov/govuk-helm-charts/blob/main/charts/app-config/values-production.yaml#L2972 [popularity-rake-task]: https://github.com/alphagov/search-api/blob/main/lib/tasks/page_traffic.rake [sync-job]: https://github.com/alphagov/govuk-helm-charts/blob/main/charts/search-index-env-sync/values.yaml [argo]: https://argo.eks.production.govuk.digital/ -[snapshot-docs]: https://www.elastic.co/docs/deploy-manage/tools/snapshot-and-restore +[snapshot-docs]: https://docs.opensearch.org/latest/tuning-your-cluster/availability-and-recovery/snapshots/snapshot-restore/ diff --git a/source/manual/govuk-env-sync.html.md b/source/manual/govuk-env-sync.html.md index 33f0f89d12c..391e755d7af 100644 --- a/source/manual/govuk-env-sync.html.md +++ b/source/manual/govuk-env-sync.html.md @@ -36,7 +36,7 @@ $ kubectl logs -n apps db-backup-link-checker-api-postgres-29220583-abcde -c 0-r ## How it works -The env sync process is made up of a lot of small Kubernetes cronjobs - one per app and environment - [configured in the 'db-backup' chart](https://github.com/alphagov/govuk-helm-charts/blob/main/charts/db-backup/values.yaml). There is also a [search-index-env-sync](https://github.com/alphagov/govuk-helm-charts/tree/main/charts/search-index-env-sync) chart for copying search API's elasticsearch index data. +The env sync process is made up of a lot of small Kubernetes cronjobs - one per app and environment - [configured in the 'db-backup' chart](https://github.com/alphagov/govuk-helm-charts/blob/main/charts/db-backup/values.yaml). There is also a [search-index-env-sync](https://github.com/alphagov/govuk-helm-charts/tree/main/charts/search-index-env-sync) chart for copying search API's OpenSearch index data. The 'production' cronjobs back up their respective application's database data to a production S3 bucket called `govuk-production-database-backups` (using a 'backup' operation - see [example](https://github.com/alphagov/govuk-helm-charts/blob/4b922fc7eb79757080570d33b1ae668c4d9dbb4f/charts/db-backup/values.yaml#L107-L111)). The bucket is [configured to automatically replicate](https://github.com/alphagov/govuk-infrastructure/blob/4f451dd56d43042e3fe0477235e9f2126618c957/terraform/deployments/govuk-publishing-infrastructure/db_backup_s3.tf) to S3 buckets [in the other environments](https://github.com/alphagov/govuk-infrastructure/blob/4f451dd56d43042e3fe0477235e9f2126618c957/terraform/deployments/govuk-publishing-infrastructure/db_backup_iam.tf#L1-L8). You can read more about [how GOV.UK data backups are configured in AWS](/manual/backups.html). diff --git a/source/manual/govuk-search.html.md b/source/manual/govuk-search.html.md index 60b65f25f22..13337aa2a96 100644 --- a/source/manual/govuk-search.html.md +++ b/source/manual/govuk-search.html.md @@ -44,7 +44,7 @@ Documentation on how finder frontend queries the two search api applications is [search-api-v2][] was built to improve the quality of search results for the majority of GOV.UK users (when compared with search-api) and retains a "minimally compatible" API with search-api. It uses Google Cloud Platform (GCP)'s Agent Search ("Discovery Engine") product as its underlying search engine. -[search-api][] uses an old version of Elasticsearch as its underlying search engine. There is currently no clear roadmap for retiring search-api. +[search-api][] uses OpenSearch as its underlying search engine. There is currently no clear roadmap for retiring search-api. ## How content gets into search diff --git a/source/manual/investigate-when-search-is-down.html.md b/source/manual/investigate-when-search-is-down.html.md index 87bb086d269..68d536ecd60 100644 --- a/source/manual/investigate-when-search-is-down.html.md +++ b/source/manual/investigate-when-search-is-down.html.md @@ -17,7 +17,7 @@ This information is currently summarised as a [flow chart][link-2] ## Identify what exactly is broken -Searches from [search/all][link-5] with a query param are sent to SearchAPI v2, and Discovery Engine. [Without a query param][link-12], requests are sent to SearchAPI (v1), which talks to Elasticsearch. So a quick way to identify which search stack is implicated is to see if searching with or without a query param results in different behaviour. +Searches from [search/all][link-5] with a query param are sent to SearchAPI v2, and Discovery Engine. [Without a query param][link-12], requests are sent to SearchAPI (v1), which talks to Opensearch. So a quick way to identify which search stack is implicated is to see if searching with or without a query param results in different behaviour. ### Check the error rates for site search diff --git a/source/manual/kibana.html.md b/source/manual/kibana.html.md index a10f67195e7..9b6f2c4c71a 100644 --- a/source/manual/kibana.html.md +++ b/source/manual/kibana.html.md @@ -160,7 +160,7 @@ Here is an example of finding all requests to the Transition Checker login page This has no advantage over using Lucene query syntax in the search bar, which is much simpler: `request:*transition-check\/login* AND status:410`. -However, if you wanted to count the number of unique IP addresses that were served this response, you need an [aggregation](https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations.html), which requires the Elasticsearch syntax. +However, if you wanted to count the number of unique IP addresses that were served this response, you need an [aggregation](https://docs.opensearch.org/latest/aggregations/), which requires the OpenSearch syntax. Choose "Dev Tools" in the menu on the left, then fill out your JSON search, ensuring that you retain the `GET _search` on line 1. You'll probably want to specify your date range in JSON as there is no way to do this through the UI on this screen. diff --git a/source/manual/make-a-new-document-type-available-to-search.html.md b/source/manual/make-a-new-document-type-available-to-search.html.md index a46b41b2a3f..6fdf522b69e 100644 --- a/source/manual/make-a-new-document-type-available-to-search.html.md +++ b/source/manual/make-a-new-document-type-available-to-search.html.md @@ -19,7 +19,7 @@ For the new document type to be indexed, you need to add it to a whitelist. ### 1. Decide what fields you want to make available to search Search API has its own concept of [document type][doc-types], which represents -the schema used to store documents in Elasticsearch (the search engine). +the schema used to store documents in OpenSearch (the search engine). Normally, you’ll map your document type to an existing Search API document type. If in doubt, use "[edition][edition]", as this is used for most documents. Then, modify [mapped_document_types.yml][mapped-doc-types] with the mapping @@ -35,7 +35,7 @@ schema uses different fields to render the text of the page, update the [IndexableContentPresenter][i-c-presenter] as well. The part of Search API that translates between Publishing API fields and search -fields is [ElasticsearchPresenter][e-s-presenter]. +fields is [OpensearchPresenter][o-s-presenter]. Modify this if there is anything special you want search to do with your documents (for example: appending additional information to the title). @@ -49,7 +49,7 @@ API. If your new document uses an existing schema, **this is not necessary**. Reindex the `govuk` index following the instructions in -[Reindex an Elasticsearch index][reindex]. +[Reindex an OpenSearch index][reindex]. ### 4. Republish all the documents @@ -66,13 +66,13 @@ You can test that the documents appear in search through the API using a query s - [https://www-origin.integration.publishing.service.gov.uk/api/search.json?count=0&filter_content_store_document_type=guide][query-2] [search-api]: https://github.com/alphagov/search-api -[doc-types]: https://github.com/alphagov/search-api/blob/main/docs/schemas.md#elasticsearch-document-types -[edition]: https://github.com/alphagov/search-api/blob/main/config/schema/elasticsearch_types/edition.json +[doc-types]: https://github.com/alphagov/search-api/blob/main/docs/schemas.md#opensearch-document-types +[edition]: https://github.com/alphagov/search-api/blob/main/config/schema/opensearch_types/edition.json [mapped-doc-types]: https://github.com/alphagov/search-api/blob/main/config/govuk_index/mapped_document_types.yaml [i-c-presenter]: https://github.com/alphagov/search-api/blob/main/lib/govuk_index/presenters/indexable_content_presenter.rb -[e-s-presenter]: https://github.com/alphagov/search-api/blob/main/lib/govuk_index/presenters/elasticsearch_presenter.rb +[o-s-presenter]: https://github.com/alphagov/search-api/blob/main/lib/govuk_index/presenters/opensearch_presenter.rb [allowed-formats]: https://github.com/alphagov/search-api/blob/main/config/govuk_index/allowed_formats.yaml -[reindex]: reindex-elasticsearch.html +[reindex]: reindex-opensearch.html [task]: https://github.com/alphagov/publishing-api/blob/main/lib/tasks/represent_downstream.rake [query-1]: https://www.gov.uk/api/search.json?count=0&filter_content_store_document_type=guide [query-2]: https://www-origin.integration.publishing.service.gov.uk/api/search.json?count=0&filter_content_store_document_type=guide diff --git a/source/manual/manage-opensearch-on-aws.html.md b/source/manual/manage-opensearch-on-aws.html.md index b2d6e884cd2..d980bc61ef3 100644 --- a/source/manual/manage-opensearch-on-aws.html.md +++ b/source/manual/manage-opensearch-on-aws.html.md @@ -6,7 +6,7 @@ layout: manual_layout parent: "/manual.html" --- -[AWS OpenSearch] is an open source, distributed search and analytics suite derived from Elasticsearch. +[AWS OpenSearch] is an open source, distributed search and analytics suite derived from OpenSearch. ## Access OpenSearch Dashboard diff --git a/source/manual/elasticsearch-dumps.html.md b/source/manual/opensearch-dumps.html.md similarity index 69% rename from source/manual/elasticsearch-dumps.html.md rename to source/manual/opensearch-dumps.html.md index e22cf0fd03e..fb23f8e4fab 100644 --- a/source/manual/elasticsearch-dumps.html.md +++ b/source/manual/opensearch-dumps.html.md @@ -1,6 +1,6 @@ --- owner_slack: "#govuk-searchandnav" -title: Restore Elasticsearch indices from backup +title: Restore OpenSearch indices from backup parent: "/manual.html" layout: manual_layout section: Backups @@ -8,12 +8,12 @@ section: Backups ## Background -AWS Managed Elasticsearch automatically takes hourly snapshots for backup and +AWS Managed OpenSearch automatically takes hourly snapshots for backup and disaster recovery purposes. The snapshot data is stored in an Amazon-owned S3 bucket that is not directly available to us via S3 but is configured as an -Elasticsearch snapshot repository called `cs-automated-enc`. +OpenSearch snapshot repository called `cs-automated-enc`. -Restores are done via the Elasticsearch API, by making HTTP requests to the +Restores are done via the OpenSearch API, by making HTTP requests to the `_snapshot` endpoint. We also have a `govuk-production` snapshot repository, which is normally only @@ -26,7 +26,7 @@ used for copying indices from production to the non-production environments. ```sh k exec deploy/search-api -- \ - sh -c 'curl "$ELASTICSEARCH_URI/_snapshot/cs-automated-enc/_all?pretty"' + sh -c 'curl "$OPENSEARCH_URI/_snapshot/cs-automated-enc/_all?pretty"' ``` This can take a few seconds. @@ -35,7 +35,7 @@ used for copying indices from production to the non-production environments. restore, delete the existing index. ```sh - k exec deploy/search-api -- sh -c 'curl -XDELETE "$ELASTICSEARCH_URI/"' + k exec deploy/search-api -- sh -c 'curl -XDELETE "$OPENSEARCH_URI/"' ``` 3. Restore the index from the snapshot. Fill in `` and @@ -43,14 +43,14 @@ used for copying indices from production to the non-production environments. ```sh k exec deploy/search-api -- \ - sh -c 'curl -XPOST -H 'Content-Type: application/json' "$ELASTICSEARCH_URI/_snapshot/cs-automated-enc//_restore" -d "{\"indices\": \"\"}"' + sh -c 'curl -XPOST -H 'Content-Type: application/json' "$OPENSEARCH_URI/_snapshot/cs-automated-enc//_restore" -d "{\"indices\": \"\"}"' ``` 4. The restore can take a few minutes. The `/_cat/recovery` resource gives an indication of progress. ```sh - k exec deploy/search-api -- sh -c 'curl "$ELASTICSEARCH_URI/_cat/recovery"' + k exec deploy/search-api -- sh -c 'curl "$OPENSEARCH_URI/_cat/recovery"' ``` 5. Once the restore has finished, [reprocess any content @@ -70,14 +70,14 @@ Restoring all indices is a similar procedure to restoring a specific index. 1. Delete all indices. ```sh - k exec deploy/search-api -- sh -c 'curl -XDELETE "$ELASTICSEARCH_URI/_all"' + k exec deploy/search-api -- sh -c 'curl -XDELETE "$OPENSEARCH_URI/_all"' ``` 1. Restore all indices from the snapshot. ```sh k exec deploy/search-api -- \ - sh -c 'curl -XPOST "$ELASTICSEARCH_URI/_snapshot/cs-automated-enc//_restore"' + sh -c 'curl -XPOST "$OPENSEARCH_URI/_snapshot/cs-automated-enc//_restore"' ``` 1. Once the restore has finished, reprocess recent content changes to bring the @@ -87,4 +87,4 @@ Restoring all indices is a similar procedure to restoring a specific index. See [Restoring snapshots](https://docs.aws.amazon.com/opensearch-service/latest/developerguide/managedomains-snapshots.html#managedomains-snapshot-restore) -in the AWS Managed Elasticsearch/Opensearch documentation. +in the AWS Managed OpenSearch documentation. diff --git a/source/manual/reindex-elasticsearch.html.md.erb b/source/manual/reindex-opensearch.html.md.erb similarity index 73% rename from source/manual/reindex-elasticsearch.html.md.erb rename to source/manual/reindex-opensearch.html.md.erb index ed77830f898..3bafb4fa20d 100644 --- a/source/manual/reindex-elasticsearch.html.md.erb +++ b/source/manual/reindex-opensearch.html.md.erb @@ -1,6 +1,6 @@ --- owner_slack: "#govuk-search" -title: "Reindex an Elasticsearch index" +title: "Reindex an OpenSearch index" section: Search on GOV.UK layout: manual_layout parent: "/manual.html" @@ -9,8 +9,8 @@ related_repos: [search-api] ## When to reindex -After updating an Elasticsearch index's schema by [changing the fields or document -types](add-a-new-field-to-an-elasticsearch-document-type.html), +After updating an OpenSearch index's schema by [changing the fields or document +types](add-a-new-field-to-an-opensearch-document-type.html), you need to reindex the affected index before the new fields and types can be used. @@ -26,25 +26,21 @@ in-place. Updating supertypes can be done during working hours. ## What the reindexing process does -1. Locks the Elasticsearch index to prevent writes to the index while data is being copied. +1. Locks the OpenSearch index to prevent writes to the index while data is being copied. 1. Creates a new index using the schema defined in the deployed version of search-api. 1. Copies all the data from the old to the new index. 1. Checks that the task completed successfully. 1. If everything looks good, switches the [index - alias](https://www.elastic.co/guide/en/elasticsearch/reference/current/indices-aliases.html) + alias](https://docs.opensearch.org/latest/im-plugin/index-alias/) to the new index. -## Reindex an Elasticsearch index +## Reindex an OpenSearch index ### 1. Preflight checks Make sure that you have sufficient space to complete an index migration. -You can check this in: - -- The [AWS Opensearch cluster health dashboard](https://eu-west-1.console.aws.amazon.com/aos/home?region=eu-west-1#opensearch/domains/green-elasticsearch6-domain?tabId=clusterHealth). -- [Total free storage space](https://eu-west-1.console.aws.amazon.com/cloudwatch/home?region=eu-west-1#metricsV2?graph=~(metrics~(~(~(expression~'FLOOR*28m1*2f1024*29~label~'FreeStorageSpace~id~'e1~region~'eu-west-1~yAxis~'right))~(~'AWS*2fES~'FreeStorageSpace~'DomainName~'green-elasticsearch6-domain~'ClientId~'172025368201~(id~'m1~region~'eu-west-1~visible~false)))~view~'timeSeries~stacked~false~region~'eu-west-1~title~'Total*20free*20storage*20space*20*28GiB*29~period~60~stat~'Sum~yAxis~(left~(showUnits~true~min~0)~right~(min~0))~legend~(position~'hidden)~start~'-PT12H~end~'P0D)) for the cluster in AWS CloudWatch. -(This link is for the production cluster. For integration/staging you will need to update the client ID.) +You can check this in [AWS Opensearch cluster health dashboard](https://eu-west-1.console.aws.amazon.com/aos/home?region=eu-west-1#opensearch/domains). Click 'search-domain-' and 'cluster-health'. If the free storage is below 250GB, check to see if there are any old indices from a previous migration that have not been cleaned up. @@ -59,7 +55,7 @@ eval $(gds aws govuk-production-developer -e --art 8h) List the search indices (sorting by index name): ```sh -k exec deploy/search-api -- sh -c 'curl -s "$ELASTICSEARCH_URI/_cat/indices?v&s=i"' +k exec deploy/search-api -- sh -c 'curl -s "$OPENSEARCH_URI/_cat/indices?v&s=i"' ``` You should see a table listing the indices. There should be one each of `govuk`, `metasearch` and `page-traffic` (plus others which are not affected by this task). @@ -98,7 +94,7 @@ To monitor progress, you can check how many documents have been copied to the new index: ```sh -k exec deploy/search-api -- sh -c 'curl "$ELASTICSEARCH_URI/_cat/indices?v"' +k exec deploy/search-api -- sh -c 'curl "$OPENSEARCH_URI/_cat/indices?v"' ``` ### 3. Clean up @@ -125,7 +121,7 @@ To update the index, follow the guidance on [fixing out-of-date search indices]( #### Failed to switch to new index -The final part of the reindex is to switch Elasticsearch over to the newly created indexes. We've noticed recently that this isn't always successful. +The final part of the reindex is to switch OpenSearch over to the newly created indexes. We've noticed recently that this isn't always successful. It appears that if content is written to the database while the reindex task is running, the task will fail at the end as it detects a difference in the data. **Re-running the reindex task usually fixes this.** @@ -137,13 +133,13 @@ If you need to cancel the reindexing while it's in progress: 1. Find the ID of the reindexing task: ```sh - k exec deploy/search-api -- sh -c 'curl "$ELASTICSEARCH_URI/_tasks?actions=%2Areindex&pretty"' + k exec deploy/search-api -- sh -c 'curl "$OPENSEARCH_URI/_tasks?actions=%2Areindex&pretty"' ``` 1. Stop the task: ``` - k exec deploy/search-api -- sh -c 'curl -XPOST "$ELASTICSEARCH_URI/_tasks//_cancel"' + k exec deploy/search-api -- sh -c 'curl -XPOST "$OPENSEARCH_URI/_tasks//_cancel"' ``` 1. Unlock the old index by running the `search:unlock` Rake task: