diff --git a/1_infrastructure/README.md b/1_infrastructure/README.md new file mode 100644 index 0000000000000000000000000000000000000000..ab6fb3d555d2519b5f158c2991831b9190f6f83f --- /dev/null +++ b/1_infrastructure/README.md @@ -0,0 +1,11 @@ +# 1. 인프라 (Infrastructure) + +이 디렉터리는 서버, 네트워크, 배포 등 금도의 인프라와 관련된 모든 설정과 문서를 포함합니다. + +## 📁 하위 디렉터리 + +- **[docker/](./docker/)**: Docker 관련 설정, Docker Compose 파일 및 관련 스크립트를 포함합니다. +- **[nginx/](./nginx/)**: Nginx 웹 서버의 설정 파일 및 관련 문서를 포함합니다. +- **[server_backup/](./server_backup/)**: 서버 데이터 백업을 위한 스크립트 및 가이드를 포함합니다. + +각 디렉터리로 이동하여 필요한 설정과 문서를 찾아보세요. \ No newline at end of file diff --git a/docker/.gitignore b/1_infrastructure/docker/.gitignore similarity index 100% rename from docker/.gitignore rename to 1_infrastructure/docker/.gitignore diff --git a/docker/README.md b/1_infrastructure/docker/README.md similarity index 100% rename from docker/README.md rename to 1_infrastructure/docker/README.md diff --git a/1_infrastructure/docker/ai_career_portfolio_guidelines.md b/1_infrastructure/docker/ai_career_portfolio_guidelines.md new file mode 100644 index 0000000000000000000000000000000000000000..11aa50290f3a87857d7d957b73d906e5056656a1 --- /dev/null +++ b/1_infrastructure/docker/ai_career_portfolio_guidelines.md @@ -0,0 +1,219 @@ +# AI 분야 취업 포트폴리오 가이드라인 + +## 개요 +이 가이드라인은 AI 전문가 양성 과정 학생들이 산업 현장에서 경쟁력 있는 취업 포트폴리오를 구성하는데 도움을 주기 위해 작성되었습니다. 실제 기업 채용 담당자들의 피드백을 바탕으로, AI 엔지니어, 데이터 사이언티스트, ML 연구원 등 다양한 직무에 맞는 포트폴리오 구성 방법을 안내합니다. + +## 목차 +1. [포트폴리오의 중요성과 목적](#1-포트폴리오의-중요성과-목적) +2. [직무별 포트폴리오 차별화 전략](#2-직무별-포트폴리오-차별화-전략) +3. [포트폴리오 구성 요소](#3-포트폴리오-구성-요소) +4. [프로젝트 기획 및 선정](#4-프로젝트-기획-및-선정) +5. [기술적 깊이 입증하기](#5-기술적-깊이-입증하기) +6. [실무 역량 강조하기](#6-실무-역량-강조하기) +7. [효과적인 포트폴리오 발표 방법](#7-효과적인-포트폴리오-발표-방법) +8. [포트폴리오 체크리스트](#8-포트폴리오-체크리스트) + +## 1. 포트폴리오의 중요성과 목적 + +### 왜 포트폴리오가 중요한가? +AI 분야는 단순한 이론적 지식보다 **실질적인 문제 해결 능력**과 **코드 구현 역량**이 중요합니다. 포트폴리오는 이러한 능력을 채용 담당자에게 직접적으로 보여줄 수 있는 강력한 증거입니다. + +### 포트폴리오의 주요 목적 +1. **기술적 역량 증명**: 실제 코드와 결과물을 통한 기술력 입증 +2. **문제 해결 과정 공유**: 도전 과제를 어떻게 해결했는지 보여주는 사고 과정 전시 +3. **지속적 학습 의지 표현**: 최신 기술 트렌드를 따라가는 학습 의지 증명 +4. **실무 적응력 제시**: 실제 업무 환경과 유사한 프로젝트 경험 공유 + +### 채용 담당자가 포트폴리오에서 보고 싶은 것 +- **실용적 접근법**: 학문적 접근보다 실질적인 비즈니스 문제 해결 능력 +- **코드 품질**: 깔끔하고 유지보수 가능한 코드 작성 능력 +- **의사소통 능력**: 복잡한 기술적 개념을 명확하게 설명하는 능력 +- **프로젝트 완성도**: 시작부터 끝까지 프로젝트를 완료하는 끈기와 실행력 + +## 2. 직무별 포트폴리오 차별화 전략 + +### AI/ML 엔지니어 +- **강조점**: 모델 구현, 파이프라인 구축, 시스템 통합, 성능 최적화 +- **추천 프로젝트**: + - 엔드투엔드 ML 파이프라인 구축 + - 모델 서빙 API 개발 + - 분산 학습 시스템 구현 + - MLOps 도구 활용 사례 +- **필수 기술**: Docker, Kubernetes, CI/CD, 클라우드 서비스, REST API + +### 데이터 사이언티스트 +- **강조점**: 데이터 분석, 통계적 모델링, 비즈니스 인사이트 도출 +- **추천 프로젝트**: + - 탐색적 데이터 분석(EDA) 및 시각화 + - A/B 테스트 설계 및 분석 + - 예측 모델링 및 비즈니스 영향 평가 + - 데이터 기반 의사결정 사례 +- **필수 기술**: 통계 분석, 데이터 시각화, 가설 검정, SQL, Pandas/NumPy + +### 머신러닝 연구원 +- **강조점**: 알고리즘 이해, 논문 구현, 새로운 방법론 개발 +- **추천 프로젝트**: + - 최신 논문 구현 및 개선 + - 알고리즘 벤치마킹 및 성능 비교 + - 새로운 모델 아키텍처 제안 + - 실험 설계 및 결과 분석 +- **필수 기술**: 수학적 모델링, 딥러닝 프레임워크, 논문 리서치, 실험 설계 + +### 컴퓨터 비전 전문가 +- **강조점**: 이미지/비디오 처리, 객체 인식, 이미지 생성 +- **추천 프로젝트**: + - 객체 검출 및 세그먼테이션 + - 이미지 분류 및 검색 시스템 + - 얼굴 인식 또는 감정 분석 + - 생성형 모델(GAN, Diffusion) 응용 +- **필수 기술**: OpenCV, 이미지 전처리, CNN 아키텍처, 컴퓨터 비전 라이브러리 + +### 자연어처리(NLP) 전문가 +- **강조점**: 텍스트 처리, 언어 모델링, 정보 추출 +- **추천 프로젝트**: + - 감성 분석 또는 텍스트 분류 + - 챗봇 또는 대화 시스템 + - 정보 추출 및 요약 + - 대규모 언어 모델(LLM) 미세 조정 +- **필수 기술**: 텍스트 전처리, 임베딩 기법, Transformer 아키텍처, 토크나이저 + +## 3. 포트폴리오 구성 요소 + +### 필수 포함 요소 +1. **개인 소개**: 자신의 전문 분야, 관심사, 커리어 목표 (1-2 문단) +2. **기술 스택**: 프로그래밍 언어, 프레임워크, 도구 등 (시각적 요소 활용) +3. **주요 프로젝트** (3-5개): + - 프로젝트명과 한 줄 요약 + - 해결하고자 한 문제 + - 사용한 기술과 방법론 + - 결과 및 성과 + - 배운 점과 개선 사항 + - GitHub 링크 +4. **교육 및 자격증**: 관련 학위, 코스, 자격증 (간결하게) +5. **연락처 및 소셜 링크**: GitHub, LinkedIn, 개인 블로그/웹사이트 + +### 포트폴리오 형식 옵션 +1. **개인 웹사이트**: 가장 전문적이고 커스터마이징 자유도 높음 +2. **GitHub 프로필**: 코드 중심 포트폴리오, README.md 활용 +3. **노션(Notion)**: 문서와 멀티미디어 통합 용이, 공유 간편 +4. **PDF 문서**: 전통적 형식, 이메일 첨부 및 출력 용이 +5. **인터랙티브 노트북**: Jupyter Notebook 또는 Colab, 코드와 결과 시각화 + +## 4. 프로젝트 기획 및 선정 + +### 좋은 프로젝트의 기준 +- **실제 문제 해결**: 실생활 또는 비즈니스 문제 해결에 중점 +- **기술적 깊이**: 단순 튜토리얼 이상의 깊이 있는 구현 +- **완성도**: 시작부터 끝까지 완료된 프로젝트 +- **독창성**: 남들과 차별화되는 아이디어나 접근법 +- **확장성**: 추가 기능이나 개선 가능성 제시 + +### 추천 프로젝트 유형 +1. **산업 문제 해결형**: 특정 산업의 실제 문제 해결 (예: 의료 영상 진단, 금융 사기 탐지) +2. **서비스 개발형**: 실제 사용 가능한 서비스 구현 (예: 추천 시스템, 챗봇) +3. **데이터 분석형**: 흥미로운 데이터셋에 대한 심층 분석 (예: 소비자 행동 분석, 트렌드 예측) +4. **알고리즘 개선형**: 기존 알고리즘 개선 또는 새로운 접근법 제안 +5. **복제 및 확장형**: 유명 논문/서비스 복제 후 자체 아이디어로 확장 + +### 피해야 할 프로젝트 +- 너무 단순한 분류 문제 (예: MNIST, Iris 데이터셋만 사용) +- 튜토리얼을 그대로 따라한 프로젝트 +- 데이터 수집 및 전처리 과정이 없는 프로젝트 +- 목표와 평가 지표가 불분명한 프로젝트 +- 비즈니스/실용적 가치를 설명하지 못하는 프로젝트 + +## 5. 기술적 깊이 입증하기 + +### 코드 품질 향상 방법 +- **클린 코드 원칙**: 읽기 쉽고 유지보수 가능한 코드 작성 +- **모듈화**: 재사용 가능한 컴포넌트로 구조화 +- **문서화**: 함수, 클래스, 모듈에 대한 명확한 주석 및 문서 +- **테스트**: 단위 테스트, 통합 테스트 구현 +- **버전 관리**: 의미 있는 커밋 메시지와 브랜치 전략 + +### 기술적 의사결정 설명하기 +- 선택한 알고리즘/모델의 이유 +- 대안 기술과의 비교 및 트레이드오프 +- 성능 최적화를 위한 접근법 +- 직면한 기술적 도전과 해결 방법 +- 확장성 및 유지보수성 고려사항 + +### 실험 및 검증 방법 +- 명확한 평가 지표 설정 +- 교차 검증 및 통계적 유의성 테스트 +- 베이스라인 모델과의 비교 +- 하이퍼파라미터 최적화 과정 +- 모델 해석 및 설명 가능성 + +## 6. 실무 역량 강조하기 + +### 프로젝트 관리 능력 보여주기 +- GitHub Issues, Project 보드 활용 +- 명확한 프로젝트 목표 및 마일스톤 설정 +- 일정 관리 및 작업 우선순위 설정 +- 문제 해결 과정의 체계적 기록 + +### 협업 및 의사소통 능력 +- 오픈소스 프로젝트 기여 내역 +- 팀 프로젝트에서의 역할과 기여도 +- 코드 리뷰 경험 및 피드백 수용 사례 +- 기술적 내용의 명확한 문서화 및 설명 + +### 산업 표준 및 도구 활용 +- 개발환경: Docker, Git, IDE 설정 +- CI/CD: GitHub Actions, Jenkins +- 모니터링: TensorBoard, MLflow, Weights & Biases +- 배포: 클라우드 서비스(AWS, GCP, Azure) +- 협업 도구: Jira, Confluence, Slack + +## 7. 효과적인 포트폴리오 발표 방법 + +### 발표 자료 준비 +- 명확한 문제 정의로 시작 +- 핵심 기술적 도전과 해결책 강조 +- 결과를 시각적으로 효과적으로 표현 +- 실제 데모 또는 시연 영상 준비 +- 간결하고 전문적인 슬라이드 디자인 + +### 기술 인터뷰 대비 +- 프로젝트 관련 심층 질문 예상 및 준비 +- 기술적 결정의 이유와 대안 설명 가능 +- 사용한 알고리즘/모델의 원리 설명 준비 +- 발생 가능한 엣지 케이스와 한계점 인지 +- 확장 및 개선 방향에 대한 아이디어 준비 + +### 비전공자를 위한 설명 전략 +- 전문 용어를 줄이고 일상 언어로 설명 +- 비유와 시각적 요소 활용 +- 비즈니스 가치와 실용적 측면 강조 +- 중요 개념은 간결하게 정의 제공 +- 스토리텔링 방식으로 흥미 유발 + +## 8. 포트폴리오 체크리스트 + +### 내용적 측면 +- [ ] 3-5개의 다양한 깊이/복잡도를 가진 프로젝트 포함 +- [ ] 각 프로젝트가 특정 기술/역량을 보여줌 +- [ ] 문제 정의, 접근법, 결과, 배운 점이 명확히 설명됨 +- [ ] 코드와 프로젝트가 적절히 문서화됨 +- [ ] 실제 사용자/비즈니스 가치를 설명함 + +### 기술적 측면 +- [ ] GitHub 저장소가 잘 정리되어 있음 (README, .gitignore 등) +- [ ] 코드 스타일과 구조가 일관적이고 깔끔함 +- [ ] 적절한 테스트와 검증 과정이 포함됨 +- [ ] 데이터 처리 및 모델링 파이프라인이 명확함 +- [ ] 결과의 시각화와 해석이 포함됨 + +### 형식적 측면 +- [ ] 오타나 문법 오류가 없음 +- [ ] 일관된 시각적 스타일과 구조 +- [ ] 간결하고 전문적인 어조 +- [ ] 쉽게 탐색 가능한 구조 +- [ ] 모든 링크와 참조가 작동함 + +## 결론 + +효과적인 AI 분야 취업 포트폴리오는 단순한 프로젝트 나열이 아니라, 지원자의 기술적 역량과 문제 해결 능력, 그리고 실무 적응력을 종합적으로 보여주는 도구입니다. 이 가이드라인을 참고하여 자신만의 강점을 효과적으로 드러내는 포트폴리오를 구성하시기 바랍니다. + +무엇보다 포트폴리오는 자신의 열정과 지속적인 학습 의지를 보여주는 살아있는 문서입니다. 정기적으로 업데이트하고 발전시켜 나가는 것이 중요합니다. \ No newline at end of file diff --git a/1_infrastructure/docker/ai_industry_case_studies.md b/1_infrastructure/docker/ai_industry_case_studies.md new file mode 100644 index 0000000000000000000000000000000000000000..a6a490256726b30132484223f55da2fec04379df --- /dev/null +++ b/1_infrastructure/docker/ai_industry_case_studies.md @@ -0,0 +1,255 @@ +# 산업별 AI 적용 사례 연구 + +## 개요 +이 문서는 다양한 산업 분야에서 AI가 어떻게 적용되고 있는지에 대한 사례 연구를 제공합니다. 각 산업별로 대표적인 AI 활용 사례, 구현 방법, 사용된 기술, 비즈니스 성과 등을 포함하고 있으며, 학생들이 실제 산업 환경에서의 AI 적용에 대한 이해를 높이고 자신의 프로젝트에 활용할 수 있도록 구성되었습니다. + +## 목차 +1. [헬스케어 산업](#1-헬스케어-산업) +2. [금융 산업](#2-금융-산업) +3. [제조 산업](#3-제조-산업) +4. [유통/소매 산업](#4-유통소매-산업) +5. [농업 산업](#5-농업-산업) + +## 1. 헬스케어 산업 + +### 1.1 의료 영상 진단 - 서울아산병원 & VUNO + +#### 배경 및 과제 +서울아산병원은 방대한 양의 X-ray, MRI, CT 영상 데이터를 처리하고 진단 정확도를 높이는 것이 주요 과제였습니다. 특히 방사선 전문의의 업무 부담이 높아 진단 시간 단축이 필요한 상황이었습니다. + +#### AI 적용 솔루션 +- **기술:** 딥러닝 기반 의료 영상 분석 (VUNO Med-Chest X-ray) +- **주요 알고리즘:** + - CNN (Convolutional Neural Networks) 기반 이미지 분석 + - 앙상블 학습을 통한 정확도 향상 + - GradCAM을 활용한 판독 근거 시각화 + +#### 구현 방법 +1. 10만 건 이상의 흉부 X-ray 데이터 학습 +2. 다양한 폐 질환에 대한 다중 레이블 분류 모델 구축 +3. 병원 PACS(의료영상저장전송시스템)과 통합 + +#### 성과 및 결과 +- 폐결절, 기흉 등 주요 폐질환 탐지 정확도 95% 이상 +- 진단 시간 평균 30% 단축 +- 방사선과 의사의 업무 효율성 20% 향상 +- 특히 야간/응급 상황에서 신속한 의사결정 지원 + +### 1.2 개인 맞춤형 치료 - 삼성서울병원 정밀의료 프로젝트 + +#### 배경 및 과제 +암 환자들은 같은 유형의 암이라도 유전적 특성과 환경에 따라 치료 반응이 다양합니다. 삼성서울병원은 이러한 차이를 고려한 맞춤형 치료법 개발이 필요했습니다. + +#### AI 적용 솔루션 +- **기술:** 유전체 데이터 분석 및 AI 기반 치료법 예측 +- **주요 알고리즘:** + - 유전체 시퀀싱 데이터 분석을 위한 딥러닝 + - 약물 반응 예측을 위한 그래프 신경망(GNN) + - 환자 군집화를 위한 비지도 학습 + +#### 구현 방법 +1. 1만 명 이상의 한국인 암 환자 유전체 및 임상 데이터 수집 +2. 유전자 변이와 약물 반응 간의 상관관계 분석 +3. 환자별 최적 치료 옵션 예측 모델 개발 + +#### 성과 및 결과 +- 위암 환자 항암제 반응 예측 정확도 78% +- 불필요한 약물 처방 20% 감소 +- 치료 성공률 15% 향상 +- 환자별 맞춤형 항암치료 프로토콜 수립 + +## 2. 금융 산업 + +### 2.1 이상 금융거래 탐지 - 신한은행 FDS(Fraud Detection System) + +#### 배경 및 과제 +금융 사기 기법이 갈수록 정교해지면서 기존의 규칙 기반 탐지 시스템으로는 새로운 유형의 사기를 탐지하기 어려워졌습니다. 신한은행은 이를 개선하기 위해 AI 기반 시스템을 도입했습니다. + +#### AI 적용 솔루션 +- **기술:** 실시간 이상 거래 탐지 시스템 +- **주요 알고리즘:** + - LSTM(Long Short-Term Memory) 네트워크 + - 오토인코더(Autoencoder) 기반 이상 탐지 + - XGBoost를 활용한 특성 중요도 분석 + +#### 구현 방법 +1. 3년간의 거래 데이터와 사기 사례 5만 건 학습 +2. 고객별 거래 패턴 프로파일링 +3. 실시간 거래 모니터링 및 점수화 시스템 구축 + +#### 성과 및 결과 +- 사기 거래 탐지율 76%에서 92%로 향상 +- 오탐(false positive) 비율 40% 감소 +- 연간 2,500억원 규모의 사기 피해 방지 +- 고객 신뢰도 증가 및 브랜드 가치 향상 + +### 2.2 로보어드바이저 - NH투자증권 QV로보어드바이저 + +#### 배경 및 과제 +개인 투자자들은 전문적인 자산 관리 서비스를 높은 비용으로만 이용할 수 있었습니다. NH투자증권은 AI를 활용해 저비용으로 맞춤형 자산관리 서비스를 제공하고자 했습니다. + +#### AI 적용 솔루션 +- **기술:** 머신러닝 기반 자산 배분 및 투자 추천 엔진 +- **주요 알고리즘:** + - 강화학습을 통한 자산 배분 최적화 + - 시계열 예측 모델(ARIMA, Prophet) + - 클러스터링을 통한 투자자 유형 분류 + +#### 구현 방법 +1. 30년간의 글로벌 자산 가격 데이터 학습 +2. 투자자 위험 성향 분석 알고리즘 개발 +3. 최적 포트폴리오 구성 및 정기 리밸런싱 자동화 + +#### 성과 및 결과 +- 서비스 출시 2년 내 10만 명 이상의 고객 확보 +- 평균 운용 수익률 벤치마크 대비 2.5% 초과 달성 +- 자산관리 서비스 민주화 실현 +- 자산관리 수수료 70% 절감 효과 + +## 3. 제조 산업 + +### 3.1 스마트 팩토리 - 포스코 인공지능 용광로 + +#### 배경 및 과제 +제철 공정에서 용광로는 높은 에너지를 소비하며, 품질 유지를 위해 전문가의 지속적인 모니터링이 필요했습니다. 포스코는 AI를 도입해 공정을 최적화하고 에너지 효율을 높이고자 했습니다. + +#### AI 적용 솔루션 +- **기술:** AI 기반 용광로 자동 제어 시스템 +- **주요 알고리즘:** + - 디지털 트윈 기반 시뮬레이션 + - 강화학습을 통한 최적 제어 전략 + - 다변량 시계열 분석 + +#### 구현 방법 +1. 용광로 센서 네트워크 구축 (온도, 압력, 가스 조성 등) +2. 5년간의 운영 데이터를 활용한 AI 모델 학습 +3. 실시간 모니터링 및 자동 제어 시스템 통합 + +#### 성과 및 결과 +- 에너지 소비 10% 절감 +- 철강 품질 일관성 15% 향상 +- 연간 2,000억원의 비용 절감 +- 탄소 배출량 8% 감소 + +### 3.2 예지 정비 - 현대자동차 스마트 공장 + +#### 배경 및 과제 +자동차 생산 라인의 장비 고장은 생산 중단과 막대한 경제적 손실로 이어집니다. 현대자동차는 예방적 정비에서 AI 기반 예지 정비로 전환하고자 했습니다. + +#### AI 적용 솔루션 +- **기술:** IoT 센서 및 머신러닝 기반 예지 정비 시스템 +- **주요 알고리즘:** + - RNN 기반 시계열 이상 탐지 + - 생존 분석(Survival Analysis)을 통한 잔여 수명 예측 + - 다중 센서 융합 분석 + +#### 구현 방법 +1. 생산 설비에 IoT 센서 설치 (진동, 소음, 온도 등) +2. 설비별 정상 작동 패턴 학습 및 이상 징후 감지 모델 개발 +3. 유지보수 일정 최적화 시스템 구축 + +#### 성과 및 결과 +- 계획되지 않은 설비 중단 시간 67% 감소 +- 유지보수 비용 35% 절감 +- 설비 수명 20% 연장 +- 생산성 8% 향상 + +## 4. 유통/소매 산업 + +### 4.1 개인화된 추천 시스템 - 쿠팡 제품 추천 엔진 + +#### 배경 및 과제 +온라인 쇼핑몰에서 고객이 관심을 가질 만한 제품을 효과적으로 추천하는 것은 매출 증대의 핵심 요소입니다. 쿠팡은 방대한 제품군과 고객층에 맞는 고도화된 추천 시스템이 필요했습니다. + +#### AI 적용 솔루션 +- **기술:** 딥러닝 기반 하이브리드 추천 시스템 +- **주요 알고리즘:** + - 협업 필터링(Collaborative Filtering) + - BERT 기반 상품 설명 텍스트 분석 + - 세션 기반 추천을 위한 GNN(Graph Neural Networks) + +#### 구현 방법 +1. 구매 이력, 검색 기록, 제품 리뷰 등 다양한 데이터 소스 통합 +2. 제품간 연관성 및 사용자-제품 상호작용 그래프 구축 +3. 실시간 개인화된 추천 API 개발 및 A/B 테스트 + +#### 성과 및 결과 +- 추천 클릭률(CTR) 32% 증가 +- 장바구니 추가율 25% 상승 +- 교차 판매(Cross-selling) 45% 증가 +- 개인화된 이메일 마케팅 효과 60% 향상 + +### 4.2 수요 예측 및 재고 관리 - 롯데마트 SCM 최적화 + +#### 배경 및 과제 +롯데마트는 다양한 제품군에 대한 정확한 수요 예측과 효율적인 재고 관리가 필요했습니다. 특히 신선식품의 경우 과잉 재고는 폐기 비용을, 재고 부족은 기회 손실을 초래합니다. + +#### AI 적용 솔루션 +- **기술:** 머신러닝 기반 수요 예측 및 재고 최적화 +- **주요 알고리즘:** + - LightGBM을 활용한 수요 예측 + - 베이지안 최적화를 통한 재고 수준 결정 + - 시공간적 패턴 분석을 위한 CNN-LSTM 하이브리드 모델 + +#### 구현 방법 +1. 5년간의 판매 데이터, 프로모션 기록, 날씨 데이터 등 통합 +2. 지역별, 상품별 수요 패턴 모델링 +3. 자동화된 발주 제안 시스템 구축 + +#### 성과 및 결과 +- 신선식품 폐기율 35% 감소 +- 재고 부족으로 인한 기회 손실 25% 감소 +- 재고 유지 비용 18% 절감 +- 전체 공급망 비용 12% 절감 + +## 5. 농업 산업 + +### 5.1 정밀 농업 - 농촌진흥청 스마트팜 + +#### 배경 및 과제 +한국의 농업은 고령화와 인력 부족으로 어려움을 겪고 있습니다. 농촌진흥청은 AI와 IoT를 활용한 정밀 농업을 통해 생산성을 높이고 인력 의존도를 줄이고자 했습니다. + +#### AI 적용 솔루션 +- **기술:** AI 기반 작물 모니터링 및 환경 제어 시스템 +- **주요 알고리즘:** + - 컴퓨터 비전을 통한 작물 상태 분석 + - 강화학습 기반 최적 환경 제어 + - 시계열 예측을 통한 수확량 예측 + +#### 구현 방법 +1. 온실 내 센서 네트워크 구축 (온도, 습도, 조도, CO2 등) +2. 드론 이미지와 근접 센서를 활용한 작물 상태 모니터링 +3. 통합 제어 시스템을 통한 자동화된 환경 관리 + +#### 성과 및 결과 +- 토마토 재배 수확량 23% 증가 +- 물 사용량 30% 절감 +- 농약 및 비료 사용 25% 감소 +- 인력 투입 시간 40% 절감 + +### 5.2 병충해 조기 감지 - 경상북도 사과농가 AI 방제 시스템 + +#### 배경 및 과제 +사과 농가는 매년 병충해로 인한 막대한 손실을 입고 있으며, 기존의 정기적 방제는 비효율적이고 환경에도 부담을 주었습니다. 경상북도는 AI를 활용한 정밀 방제 시스템을 개발하고자 했습니다. + +#### AI 적용 솔루션 +- **기술:** 이미지 인식 기반 병충해 조기 감지 시스템 +- **주요 알고리즘:** + - 객체 탐지를 위한 YOLOv5 기반 모델 + - 전이학습을 통한 적은 데이터로 높은 성능 달성 + - 환경 센서 데이터와 영상 정보의 다중 모달 분석 + +#### 구현 방법 +1. 드론 및 고정 카메라를 통한 정기적 이미지 수집 +2. 주요 병충해 10종에 대한 학습 데이터셋 구축 +3. 위험도 분석 및 정밀 방제 권고 시스템 개발 + +#### 성과 및 결과 +- 병충해 조기 발견율 65% 향상 +- 농약 사용량 40% 감소 +- 수확량 손실률 50% 감소 +- 친환경 사과 인증 비율 증가 + +## 결론 + +이상의 사례 연구들은 AI가 다양한 산업 분야에서 실질적인 문제를 해결하고 비즈니스 가치를 창출하는 방식을 보여줍니다. 이러한 사례들은 학생들이 자신의 분야에서 AI를 적용할 수 있는 영감과 실질적인 지침을 제공할 수 있을 것입니다. 향후 더 많은 사례 연구가 추가될 예정이며, 각 산업별로 더 심층적인 기술 구현 방법과 데이터 처리 방식에 대한 내용도 확충될 것입니다. \ No newline at end of file diff --git a/1_infrastructure/docker/cloud_practice_environment_guide.md b/1_infrastructure/docker/cloud_practice_environment_guide.md new file mode 100644 index 0000000000000000000000000000000000000000..c463c5f2367123549a001e3e324cc2f03696d322 --- /dev/null +++ b/1_infrastructure/docker/cloud_practice_environment_guide.md @@ -0,0 +1,231 @@ +# AWS/GCP/Azure 무료 티어 활용 AI 실습 환경 구축 가이드 + +## 개요 +이 문서는 주요 클라우드 서비스인 AWS, Google Cloud Platform(GCP), Microsoft Azure의 무료 티어 서비스를 활용하여 AI 학습 및 실습 환경을 구축하는 방법을 안내합니다. 각 클라우드 서비스별로 무료로 사용할 수 있는 리소스와 설정 방법, 그리고 주의사항을 포함하고 있습니다. + +## 목차 +1. [클라우드 서비스 선택 가이드](#1-클라우드-서비스-선택-가이드) +2. [AWS 무료 티어 활용 가이드](#2-aws-무료-티어-활용-가이드) +3. [GCP 무료 티어 활용 가이드](#3-gcp-무료-티어-활용-가이드) +4. [Azure 무료 티어 활용 가이드](#4-azure-무료-티어-활용-가이드) +5. [공통 Docker 배포 방법](#5-공통-docker-배포-방법) +6. [비용 관리 및 모니터링](#6-비용-관리-및-모니터링) + +## 1. 클라우드 서비스 선택 가이드 + +| 고려사항 | AWS | GCP | Azure | +|---------|-----|-----|-------| +| **초기 크레딧** | 1년간 무료 티어 | $300 크레딧 (90일) | $200 크레딧 (30일) | +| **ML 특화 서비스** | SageMaker | Vertex AI | Azure ML | +| **GPU 가용성** | 제한적 (무료 티어에 없음) | Colab 무료 (제한적) | 제한적 (무료 티어에 없음) | +| **사용 난이도** | 복잡함 | 중간 | 사용자 친화적 | +| **문서화 수준** | 매우 상세함 | 상세함 | 매우 상세함 | +| **교육용 적합성** | 높음 (AWS Academy) | 높음 (Qwiklabs) | 높음 (MS Learn) | + +### 추천 조합 +- **초보자**: Azure 또는 GCP +- **중급자**: 모든 서비스 적합 +- **고급자**: AWS (특히 MLOps 관점) +- **무료 GPU 필요시**: GCP (Colab) + +## 2. AWS 무료 티어 활용 가이드 + +### AWS 무료 티어 개요 +AWS 무료 티어는 12개월 무료, 항상 무료, 단기 무료 평가판의 세 가지 유형으로 제공됩니다. + +### AI/ML 학습에 유용한 AWS 무료 서비스 +1. **EC2** (12개월 무료) + - t2.micro 또는 t3.micro 인스턴스 750시간/월 + - Python, Jupyter, TensorFlow 등 설치 가능 + +2. **S3** (12개월 무료) + - 5GB 스토리지, 데이터셋 저장에 활용 + +3. **Amazon SageMaker** (항상 무료) + - SageMaker Studio Lab - 무료 GPU 제한적 제공 + +4. **AWS Lambda** (항상 무료) + - 매월 100만 건의 요청, 간단한 ML 추론 API 구현 가능 + +### AWS 환경 설정 가이드 +1. **계정 생성** + ```bash + # AWS 계정 생성: https://aws.amazon.com + # 신용카드 등록 필요 (청구되지 않음) + ``` + +2. **EC2 인스턴스 시작** + ```bash + # AWS 콘솔 > EC2 > 인스턴스 시작 + # Amazon Linux 2 선택 + # t2.micro 또는 t3.micro 선택 (무료 티어 적격) + ``` + +3. **Docker로 AI 개발환경 설정** + ```bash + # EC2 접속 후 + sudo yum update -y + sudo amazon-linux-extras install docker -y + sudo systemctl start docker + sudo systemctl enable docker + sudo usermod -a -G docker ec2-user + + # 재로그인 후 + # 도커 컨테이너 실행 (JupyterLab) + docker run -d -p 8888:8888 -v $PWD:/home/jovyan/work jupyter/datascience-notebook + ``` + +### 무료 티어 한도 모니터링 +- AWS Billing 대시보드 활용 +- 비용 알림 설정: CloudWatch > 결제 알림 + +## 3. GCP 무료 티어 활용 가이드 + +### GCP 무료 티어 개요 +GCP는 $300 무료 크레딧 (90일)과 일부 항상 무료 제품을 제공합니다. + +### AI/ML 학습에 유용한 GCP 무료 서비스 +1. **Google Colab** (별도 계정) + - 무료 GPU/TPU 액세스 (세션 시간 제한) + - 노트북 형태로 개발 가능 + +2. **Compute Engine** (무료 크레딧 사용) + - e2-micro 인스턴스 (vCPU 2개, 1GB 메모리) + +3. **Cloud Storage** (항상 무료) + - 5GB 스토리지 + +4. **BigQuery** (항상 무료) + - 매월 1TB 쿼리 처리, 데이터 분석 학습에 유용 + +### GCP 환경 설정 가이드 +1. **계정 생성** + ```bash + # GCP 계정 생성: https://cloud.google.com + # 신용카드 등록 필요 (청구되지 않음) + ``` + +2. **Compute Engine VM 인스턴스 생성** + ```bash + # GCP 콘솔 > Compute Engine > VM 인스턴스 + # e2-micro 선택 + # Ubuntu 20.04 LTS 선택 + ``` + +3. **Docker로 AI 개발환경 설정** + ```bash + # VM 접속 후 + sudo apt-get update + sudo apt-get install -y docker.io + sudo systemctl start docker + sudo systemctl enable docker + sudo usermod -a -G docker $USER + + # 재로그인 후 + # 도커 컨테이너 실행 (JupyterLab) + docker run -d -p 8888:8888 -v $PWD:/home/jovyan/work jupyter/datascience-notebook + ``` + +### Google Colab 활용 +1. https://colab.research.google.com 접속 +2. 새 노트북 생성 +3. 런타임 > 런타임 유형 변경 > GPU 또는 TPU 선택 + +## 4. Azure 무료 티어 활용 가이드 + +### Azure 무료 티어 개요 +Azure는 $200 무료 크레딧 (30일)과 40개 이상의 항상 무료 서비스를 제공합니다. + +### AI/ML 학습에 유용한 Azure 무료 서비스 +1. **Azure Virtual Machines** (무료 크레딧 사용) + - B1s 인스턴스 (1 vCPU, 1GB 메모리) + +2. **Azure Storage** (항상 무료) + - 5GB 스토리지 + +3. **Azure Machine Learning** (무료 크레딧 사용) + - 워크스페이스 생성 및 간단한 모델 학습 + +4. **Azure Cognitive Services** (항상 무료) + - 일정량 내 API 호출 무료 + +### Azure 환경 설정 가이드 +1. **계정 생성** + ```bash + # Azure 계정 생성: https://azure.microsoft.com + # 신용카드 등록 필요 (청구되지 않음) + ``` + +2. **가상머신 생성** + ```bash + # Azure 포털 > 가상 머신 > 추가 + # B1s 또는 B1ls 선택 + # Ubuntu 20.04 LTS 선택 + ``` + +3. **Docker로 AI 개발환경 설정** + ```bash + # VM 접속 후 + sudo apt-get update + sudo apt-get install -y docker.io + sudo systemctl start docker + sudo systemctl enable docker + sudo usermod -a -G docker $USER + + # 재로그인 후 + # 도커 컨테이너 실행 (JupyterLab) + docker run -d -p 8888:8888 -v $PWD:/home/jovyan/work jupyter/datascience-notebook + ``` + +## 5. 공통 Docker 배포 방법 + +AI 강의 도커 환경을 각 클라우드 서비스에 일관되게 배포하기 위한 방법입니다. + +### 준비 사항 +1. 클라우드 인스턴스 접속 권한 +2. Docker 설치 완료 +3. `docker-compose.yml` 파일 준비 + +### 배포 단계 +1. **프로젝트 클론** + ```bash + git clone https://github.com/your-org/ai-course.git + cd ai-course + ``` + +2. **도커 컴포즈 실행** + ```bash + # CPU 버전 (무료 티어에 적합) + docker-compose -f docker-compose.yml up -d + + # GPU 버전 (유료 인스턴스에서만) + docker-compose -f docker-compose.gpu.yml up -d + ``` + +3. **포트포워딩 설정** + - 클라우드 콘솔에서 인바운드 포트 허용 (8888, 8000, 5000) + +4. **접속 방법** + - 브라우저에서 `http://<클라우드_인스턴스_IP>:8888` + - 토큰: `ai_course_token` + +## 6. 비용 관리 및 모니터링 + +### AWS 비용 관리 +- AWS Budgets 설정 +- AWS Cost Explorer 활용 +- 미사용 리소스 정리 (EBS 볼륨, 탄력적 IP 등) + +### GCP 비용 관리 +- 결제 알림 설정 +- 결제 내보내기 설정 +- 할당량 한도 설정 + +### Azure 비용 관리 +- Azure Cost Management 활용 +- 예산 알림 설정 +- 미사용 리소스 자동 종료 설정 + +## 결론 + +각 클라우드 서비스의 무료 티어는 AI 학습을 시작하기에 충분한 자원을 제공합니다. 실습 목적에 가장 맞는 서비스를 선택하고, 비용 모니터링을 통해 예상치 못한 청구가 발생하지 않도록 주의하세요. 더 높은 성능이 필요한 딥러닝 작업의 경우 GCP Colab이나 유료 서비스를 고려하는 것이 좋습니다. \ No newline at end of file diff --git a/docker/deployment_guide.md b/1_infrastructure/docker/deployment_guide.md similarity index 100% rename from docker/deployment_guide.md rename to 1_infrastructure/docker/deployment_guide.md diff --git a/docker/docker-windows-vm/Dockerfile b/1_infrastructure/docker/docker-windows-vm/Dockerfile similarity index 100% rename from docker/docker-windows-vm/Dockerfile rename to 1_infrastructure/docker/docker-windows-vm/Dockerfile diff --git a/docker/docker-windows-vm/README.md b/1_infrastructure/docker/docker-windows-vm/README.md similarity index 100% rename from docker/docker-windows-vm/README.md rename to 1_infrastructure/docker/docker-windows-vm/README.md diff --git a/docker/docker-windows-vm/Vagrantfile b/1_infrastructure/docker/docker-windows-vm/Vagrantfile similarity index 100% rename from docker/docker-windows-vm/Vagrantfile rename to 1_infrastructure/docker/docker-windows-vm/Vagrantfile diff --git a/docker/docker-windows-vm/docker-compose.yml b/1_infrastructure/docker/docker-windows-vm/docker-compose.yml similarity index 100% rename from docker/docker-windows-vm/docker-compose.yml rename to 1_infrastructure/docker/docker-windows-vm/docker-compose.yml diff --git a/docker/docker-windows-vm/startup.sh b/1_infrastructure/docker/docker-windows-vm/startup.sh similarity index 100% rename from docker/docker-windows-vm/startup.sh rename to 1_infrastructure/docker/docker-windows-vm/startup.sh diff --git a/docker/docker_3dp/Dockerfile b/1_infrastructure/docker/docker_3dp/Dockerfile similarity index 100% rename from docker/docker_3dp/Dockerfile rename to 1_infrastructure/docker/docker_3dp/Dockerfile diff --git a/docker/docker_3dp/README.md b/1_infrastructure/docker/docker_3dp/README.md similarity index 100% rename from docker/docker_3dp/README.md rename to 1_infrastructure/docker/docker_3dp/README.md diff --git a/docker/docker_3dp/docker-compose.yml b/1_infrastructure/docker/docker_3dp/docker-compose.yml similarity index 100% rename from docker/docker_3dp/docker-compose.yml rename to 1_infrastructure/docker/docker_3dp/docker-compose.yml diff --git a/1_infrastructure/docker/docker_3dp/printer/.gitignore b/1_infrastructure/docker/docker_3dp/printer/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..91efda18b6afb95bed91fe087d07c1ca0bf56c58 --- /dev/null +++ b/1_infrastructure/docker/docker_3dp/printer/.gitignore @@ -0,0 +1,6 @@ +gcode/ +stl/ +venv/ +log/ +.env +fff_option.txt diff --git a/1_infrastructure/docker/docker_3dp/printer/README.md b/1_infrastructure/docker/docker_3dp/printer/README.md new file mode 100644 index 0000000000000000000000000000000000000000..aaa86144556d645e478809b843b1a5506b93485d --- /dev/null +++ b/1_infrastructure/docker/docker_3dp/printer/README.md @@ -0,0 +1,131 @@ +# 3D 프린터 슬라이싱 API + +이 프로젝트는 [Flask](https://flask.palletsprojects.com/)를 사용하여 구축된 웹 API로, [PrusaSlicer](https://www.prusa3d.com/page/prusaslicer_424/)를 이용해 STL 3D 모델 파일을 G-code로 변환하는 기능을 제공합니다. Prusa MK4 3D 프린터에 최적화된 설정을 포함하고 있습니다. + +## 주요 기능 + +- **STL to G-code 변환**: `/slice` 엔드포인트를 통해 STL 파일을 G-code로 슬라이싱합니다. +- **상세한 파라미터 설정**: PrusaSlicer에서 제공하는 거의 모든 슬라이싱 파라미터를 API 요청 시점에 커스터마이징할 수 있습니다. +- **오류 처리**: 슬라이싱 과정에서 발생할 수 있는 일반적인 오류들을 감지하고, 구체적인 오류 코드와 메시지를 반환합니다. +- **파일 관리 및 프록시**: 생성된 G-code 파일을 다운로드하고, Prusa 프린터의 웹 인터페이스인 PrusaLink로 요청을 전달하는 프록시 기능을 제공합니다. + +## API 엔드포인트 + +### `POST /slice` + +STL 파일을 업로드하고 슬라이싱 옵션을 지정하여 G-code를 생성합니다. + +- **Request Body (`multipart/form-data`):** + - `file` (file, optional): 슬라이싱할 `.stl` 파일. 서버에 파일이 이미 존재하는 경우 `orignlFileNm`으로 대체할 수 있습니다. + - `orignlFileNm` (string, optional): 서버에 미리 업로드된 파일의 이름. + - `...options`: PrusaSlicer에 전달할 키-값 형태의 슬라이싱 옵션들. (자세한 내용은 아래의 '슬라이싱 옵션' 섹션 참조) + +- **Success Response (200 OK):** + ```json + { + "success": true, + "message": "모델이 성공적으로 슬라이스되었습니다." + } + ``` + +- **Error Response:** + - **파일 관련 오류:** + - `100`: 업로드된 파일이 없음. + - `200`: `orignlFileNm`으로 지정된 파일이 서버 경로에 없음. + - `300`: STL 파일이 아닌 다른 확장자 파일 업로드. + - **슬라이싱 오류 (PrusaSlicer):** + - `401`: 첫 레이어에 압출이 없는 객체가 존재. + - `402`: 객체에 대한 압출이 생성되지 않음. + - `403`: 현재 설정으로 모델을 인쇄할 수 없음. + - `404`: 지지대(support) 없이 인쇄할 수 없는 객체가 있음. + - `405`: 레이어가 감지되지 않음 (STL 파일 복구 필요). + - `406`: 현재 설정으로 패드(pad)를 생성할 수 없음. + - `407`: 인쇄할 수 없는 객체가 있음 (지지대 설정 조정 필요). + - `400`: 그 외의 알 수 없는 슬라이싱 오류. + +### `GET /getGCodeFile` + +서버에 생성된 G-code 파일을 다운로드합니다. + +- **Query Parameters:** + - `fileName` (string, required): 다운로드할 G-code 파일의 이름. + +- **Success Response (200 OK):** + - `Content-Type: application/octet-stream` + - G-code 파일 데이터 스트림. + +### `GET /getPrusaConfig` + +서버에 저장된 PrusaSlicer 설정 파일(`fff_option.txt`)의 내용을 반환합니다. + +### `ANY /proxy` + +PrusaLink 장비로 API 요청을 전달하는 프록시 역할을 합니다. PrusaLink API의 엔드포인트와 파라미터를 그대로 사용합니다. + +## 설치 및 실행 + +### 요구사항 + +- Python 3.x +- PrusaSlicer +- Flask 및 기타 Python 패키지 + +### 설정 + +1. **소스 코드 클론:** + ```bash + git clone + cd + ``` + +2. **환경 변수 설정:** + 프로젝트 루트에 `.env` 파일을 생성하고 아래 내용을 채웁니다. 이 프로젝트는 하드코딩된 경로를 사용하므로, 환경에 맞게 소스 코드(`app.py`) 수정이 필요할 수 있습니다. + ``` + # .env + PRUSA_LINK_URL=http:// + PRUSA_LINK_API_KEY= + ``` + +3. **Python 의존성 설치:** + 가상 환경을 생성하고 필요한 패키지를 설치합니다. + ```bash + python -m venv venv + source venv/bin/activate + pip install Flask Flask-Cors python-dotenv requests + ``` + (프로젝트에 `requirements.txt` 파일을 생성하여 관리하는 것을 권장합니다.) + +4. **PrusaSlicer 설치:** + PrusaSlicer를 시스템에 설치해야 합니다. `app.py`에서는 실행 경로가 `/usr/bin/PrusaSlicer`로 하드코딩되어 있으므로, 실제 설치 경로가 다를 경우 코드를 수정해야 합니다. + +5. **애플리케이션 실행:** + ```bash + flask run + ``` + +## 슬라이싱 옵션 + +API를 통해 PrusaSlicer의 다양한 설정을 제어할 수 있습니다. `slicer_test.py` 파일에 거의 모든 사용 가능한 옵션이 정의되어 있습니다. + +
+전체 옵션 목록 보기 (예시) + +```python +options = { + 'layer-height': '0.1', + 'first-layer-height': '0.2', + 'perimeters': '3', + 'top-solid-layers': '8', + 'bottom-solid-layers': '6', + 'fill-density': '15%', + 'fill-pattern': 'grid', + 'support-material': '', + 'support-material-auto': '', + # ... and many more options +} +``` +
+ +## 커스텀 G-code + +이 API는 Prusa MK4 프린터에 최적화된 시작(`start_gcode`) 및 종료(`end_gcode`) G-code를 슬라이싱 결과물에 자동으로 삽입합니다. 이 코드는 `app.py` 내에 변수로 정의되어 있으며, 필요에 따라 수정할 수 있습니다. \ No newline at end of file diff --git a/1_infrastructure/docker/docker_3dp/printer/app.bak.py b/1_infrastructure/docker/docker_3dp/printer/app.bak.py new file mode 100644 index 0000000000000000000000000000000000000000..529a3b5ecca1b79274f82cf6d592efab81095bd8 --- /dev/null +++ b/1_infrastructure/docker/docker_3dp/printer/app.bak.py @@ -0,0 +1,265 @@ +import logging +from flask import Flask, request, jsonify, Response, stream_with_context +from flask_cors import CORS +from dotenv import load_dotenv +import os +import subprocess +import requests + +app = Flask(__name__) +load_dotenv('/home/gds/printer/.env') # .env 파일 경로 +CORS(app, resources={r"/*": {"origins": "*"}}) # 모든 출처에 대해 CORS를 활성화합니다. + +# 로그 디렉토리와 파일 설정 +log_dir = '/home/gds/printer/log' +if not os.path.exists(log_dir): + os.makedirs(log_dir) +log_file = os.path.join(log_dir, 'app.log') + +# 로깅 설정 +logging.basicConfig(filename=log_file, level=logging.DEBUG, + format='%(asctime)s %(levelname)s %(name)s %(threadName)s : %(message)s') +app.logger.addHandler(logging.StreamHandler()) +app.logger.setLevel(logging.DEBUG) + +def slice_stl(file_path, output_dir, options=None): + """ + STL 파일을 PrusaSlicer를 사용하여 슬라이스하는 함수 + """ + # PrusaSlicer 명령어 생성 + prusa_slicer_path = '/usr/bin/PrusaSlicer' + + command = [ + prusa_slicer_path, '-g', + '--filament-type', options.get('filament_type'), + '--idle-temperature', options.get('idle_temperature'), + '--first-layer-temperature', options.get('first_layer_temperature'), + '--temperature', options.get('temperature'), + '--first-layer-bed-temperature', options.get('first_layer_bed_temperature'), + '--bed-temperature', options.get('bed_temperature'), + '--fill-density', options.get('fill_density')+"%", + '--fill-pattern', options.get('fill_pattern'), + '--infill-anchor', options.get('infill_anchor'), + '--infill-anchor-max', options.get('infill_anchor_max'), + '--top-fill-pattern', options.get('top_fill_pattern'), + '--bottom-fill-pattern', options.get('bottom_fill_pattern'), + '--skirts', options.get('skirts'), + '--skirt-distance', options.get('skirt_distance'), + '--skirt-height', options.get('skirt_height'), + '--draft-shield', options.get('draft_shield'), + '--min-skirt-length', options.get('min_skirt_length'), + '--brim-type', options.get('brim_type'), + '--brim-width', options.get('brim_width'), + '--brim-separation', options.get('brim_separation'), + '--support-material', options.get('support_material'), + '--support-material-auto', options.get('support_material_auto'), + '--support-material-threshold', options.get('support_material_threshold'), + '--support-material-extrusion-width', options.get('support_material_extrusion_width'), + '--raft-first-layer-density', options.get('raft_first_layer_density'), + '--raft-first-layer-expansion', options.get('raft_first_layer_expansion'), + '--perimeter-speed', options.get('perimeter_speed'), + '--small-perimeter-speed', options.get('small_perimeter_speed'), + '--external-perimeter-speed', options.get('external_perimeter_speed'), + '--infill-speed', options.get('infill_speed'), + '--solid-infill-speed', options.get('solid_infill_speed'), + '--top-solid-infill-speed', options.get('top_solid_infill_speed'), + '--support-material-speed', options.get('support_material_speed'), + '--support-material-interface-speed', options.get('support_material_interface_speed'), + '--bridge-speed', options.get('bridge_speed'), + '--gap-fill-speed', options.get('gap_fill_speed'), + '--travel-speed', options.get('travel_speed'), + '--first-layer-speed', options.get('first_layer_speed'), + '--first-layer-speed-over-raft', options.get('first_layer_speed_over_raft'), + f'"{file_path}"' + ] + + # 출력 디렉토리는 PrusaSlicer가 인식할 수 있는 형식으로 설정 + command.extend(['-o', output_dir]) + + # skirts가 0일 때 관련 옵션 제거 + if options.get('skirts') == '0': + command = [opt for idx, opt in enumerate(command) if 'skirt' not in opt and (idx == 0 or 'skirt' not in command[idx - 1])] + command = [opt for idx, opt in enumerate(command) if 'skirts' not in opt and (idx == 0 or 'skirts' not in command[idx - 1])] + + # brim-type이 no_brim일 때 관련 옵션 제거 + if options.get('brim_type') == 'no_brim': + command = [opt for idx, opt in enumerate(command) if 'brim' not in opt and (idx == 0 or 'brim' not in command[idx - 1])] + command = [opt for idx, opt in enumerate(command) if 'draft' not in opt and (idx == 0 or 'draft' not in command[idx - 1])] + + + # 이 코드 처리 중에 --support-material 이나 --support-material-auto가 true,false에 따라서 다르게 동작해야 되는데, 둘중 하나 통과하는 부분에서 + # command option이 사라진것 같아 확인 필요 + i = 0 + while i < len(command): + if command[i] == '--support-material' and options.get('support_material') == 'true': + command[i + 1] = '' # Set the next index to empty string + i += 1 # Move to the next index to skip removing '--support-material' + continue + + if command[i] == '--support-material-auto' and options.get('support_material_auto') == 'true': + command[i + 1] = '' # Set the next index to empty string + i += 1 # Move to the next index to skip removing '--support-material-auto' + continue + + if command[i] == '--support-material' and options.get('support_material') == 'false': + command.pop(i) # Remove '--support-material' + command.pop(i) # Remove the value after '--support-material' + continue + + if command[i] == '--support-material-auto' and options.get('support_material_auto') == 'false': + command.pop(i) # Remove '--support-material-auto' + command.pop(i) # Remove the value after '--support-material-auto' + continue + + i += 1 + + app.logger.debug("command : %s", command) + + try: + result = subprocess.run(' '.join(command), shell=True, capture_output=True, text=True, check=True) + app.logger.debug("PrusaSlicer output: %s", result.stdout) + return True + except subprocess.CalledProcessError as e: + app.logger.error("PrusaSlicer error: %s", e.stderr) + return False + +@app.route('/slice', methods=['POST']) +def slice_model(): + if 'file' not in request.files: + app.logger.error('No file part') + return jsonify({'error': 'No file part'}) + + file = request.files['file'] + if file.filename == '': + app.logger.error('No selected file') + return jsonify({'error': 'No selected file'}) + + # STL 파일을 저장할 경로 설정 + upload_dir = '/home/gds/printer/stl' + if not os.path.exists(upload_dir): + os.makedirs(upload_dir) + + file_path = os.path.join(upload_dir, file.filename) + file.save(file_path) + app.logger.debug('File saved to %s', file_path) + + options = { + 'filament_type': request.form.get('filament_type'), + 'idle_temperature': request.form.get('idle_temperature'), + 'first_layer_temperature': request.form.get('first_layer_temperature'), + 'temperature': request.form.get('temperature'), + 'first_layer_bed_temperature': request.form.get('first_layer_bed_temperature'), + 'bed_temperature': request.form.get('bed_temperature'), + 'fill_density': request.form.get('fill_density'), + 'fill_pattern': request.form.get('fill_pattern'), + 'infill_anchor': request.form.get('infill_anchor'), + 'infill_anchor_max': request.form.get('infill_anchor_max'), + 'top_fill_pattern': request.form.get('top_fill_pattern'), + 'bottom_fill_pattern': request.form.get('bottom_fill_pattern'), + 'skirts': request.form.get('skirts'), + 'skirt_distance': request.form.get('skirt_distance'), + 'skirt_height': request.form.get('skirt_height'), + 'draft_shield': request.form.get('draft_shield'), + 'min_skirt_length': request.form.get('min_skirt_length'), + 'brim_type': request.form.get('brim_type'), + 'brim_width': request.form.get('brim_width'), + 'brim_separation': request.form.get('brim_separation'), + 'support_material': request.form.get('support_material'), + 'support_material_auto': request.form.get('support_material_auto'), + 'support_material_threshold': request.form.get('support_material_threshold'), + 'support_material_extrusion_width': request.form.get('support_material_extrusion_width'), + 'raft_first_layer_density': request.form.get('raft_first_layer_density'), + 'raft_first_layer_expansion': request.form.get('raft_first_layer_expansion'), + 'perimeter_speed': request.form.get('perimeter_speed'), + 'small_perimeter_speed': request.form.get('small_perimeter_speed'), + 'external_perimeter_speed': request.form.get('external_perimeter_speed'), + 'infill_speed': request.form.get('infill_speed'), + 'solid_infill_speed': request.form.get('solid_infill_speed'), + 'top_solid_infill_speed': request.form.get('top_solid_infill_speed'), + 'support_material_speed': request.form.get('support_material_speed'), + 'support_material_interface_speed': request.form.get('support_material_interface_speed'), + 'bridge_speed': request.form.get('bridge_speed'), + 'gap_fill_speed': request.form.get('gap_fill_speed'), + 'travel_speed': request.form.get('travel_speed'), + 'first_layer_speed': request.form.get('first_layer_speed'), + 'first_layer_speed_over_raft': request.form.get('first_layer_speed_over_raft') + } + + # PrusaSlicer를 사용하여 STL 파일 슬라이스 + output_dir = '/home/gds/printer/gcode/' + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + success = slice_stl(file_path, output_dir, options) + + if success: + # G-code 파일 경로 + gcode_file_path = os.path.join(output_dir, os.path.splitext(file.filename)[0] + '.gcode') + return jsonify({'gcode_file_path': gcode_file_path}) + else: + return jsonify({'error': 'Failed to slice the model'}) + +@app.route('/getGCodeFile', methods=['GET']) +def get_gcode_file(): + gcode_file_path = request.args.get('gcodeFilePath') + if not gcode_file_path: + return jsonify({'error': 'Missing gcode_file_path parameter'}) + + try: + with open(gcode_file_path, 'r') as file: + gcode_string = file.read() + + return gcode_string + except FileNotFoundError: + return jsonify({'error': 'File not found'}) + +@app.route('/getPrusaConfig', methods=['GET']) +def get_prusa_config(): + config = { + 'printer1': { + 'url': os.getenv('PRUSA_PRINTER1_API_URL'), + 'api_key': os.getenv('PRUSA_PRINTER1_API_KEY') + }, + 'printer2': { + 'url': os.getenv('PRUSA_PRINTER2_API_URL'), + 'api_key': os.getenv('PRUSA_PRINTER2_API_KEY') + } + } + return jsonify(config) + +@app.route('/proxy', methods=['GET', 'POST', 'PUT', 'DELETE']) +def proxy_prusa_link(): + try: + # 요청 URL과 파라미터 설정 + url = request.args.get('url') + if not url: + return Response("URL is required", status=400) + + # PrusaLink에 보낼 요청 설정 + headers = {key: value for key, value in request.headers.items() if key != 'Host'} + response = requests.request( + method=request.method, + url=url, + headers=headers, + data=request.get_data(), + cookies=request.cookies, + stream=True # 스트리밍 응답 처리 + ) + + # PrusaLink에서 받은 스트리밍 응답을 클라이언트에 전달 + def generate(): + for chunk in response.iter_content(chunk_size=8192): + yield chunk + + proxy_response = Response(stream_with_context(generate()), status=response.status_code) + for key, value in response.headers.items(): + if key.lower() != 'content-encoding' and key.lower() != 'transfer-encoding': + proxy_response.headers[key] = value + + return proxy_response + except Exception as e: + return Response(f"An error occurred: {str(e)}", status=500) + + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=3000, debug=True) \ No newline at end of file diff --git a/1_infrastructure/docker/docker_3dp/printer/app.py b/1_infrastructure/docker/docker_3dp/printer/app.py new file mode 100644 index 0000000000000000000000000000000000000000..fad973d76a86582cec5a65a5e343fec3e0a97644 --- /dev/null +++ b/1_infrastructure/docker/docker_3dp/printer/app.py @@ -0,0 +1,339 @@ +import logging +from flask import Flask, request, jsonify, Response, stream_with_context +from flask_cors import CORS +from dotenv import load_dotenv +import os +import subprocess +import requests + +app = Flask(__name__) +load_dotenv('/home/gds/printer/.env') # .env 파일 경로 +CORS(app, resources={r"/*": {"origins": "*"}}) # 모든 출처에 대해 CORS를 활성화합니다. + +# 로그 디렉토리와 파일 설정 +log_dir = '/home/gds/printer/log' +if not os.path.exists(log_dir): + os.makedirs(log_dir) +log_file = os.path.join(log_dir, 'app.log') + +# 로깅 설정 +logging.basicConfig(filename=log_file, level=logging.DEBUG, + format='%(asctime)s %(levelname)s %(name)s %(threadName)s : %(message)s') +app.logger.addHandler(logging.StreamHandler()) +app.logger.setLevel(logging.DEBUG) + +# start_gcode, end_gcode 변수 선언 +start_gcode = """ +M17 +M862.1 P[nozzle_diameter] +M862.3 P "MK4" +M862.5 P2 +M862.6 P "Input shaper" +M115 U6.0.1+14848 +M555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} +W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))} +G90 +M83 +M140 S[first_layer_bed_temperature] + +{if filament_notes[0]=~/.*HT_MBL10.*/} +M104 T0 S{first_layer_temperature[0] - 10} +M109 T0 R{first_layer_temperature[0] - 10} +{endif} + +{if filament_type[0] == "PC" or filament_type[0] == "PA"} +M104 T0 S{first_layer_temperature[0] - 25} +M109 T0 R{first_layer_temperature[0] - 25} +{endif} + +{if filament_type[0] == "FLEX"} +M104 T0 S210 +M109 T0 R210 +{endif} + +{if filament_type[0]=~/.*PET.*/} +M104 T0 S175 +M109 T0 R175 +{endif} + +{if not (filament_notes[0]=~/.*HT_MBL10.*/ or filament_type[0] == "PC" or filament_type[0] == "PA" or filament_type[0] == "FLEX" or filament_type[0]=~/.*PET.*/)} +M104 T0 S170 +M109 T0 R170 +{endif} + +M84 E +G28 +G1 X{10 + 32} Y-4 Z5 F4800 +M302 S160 +{if filament_type[initial_tool]=="FLEX"} +G1 E-4 F2400 +{else} +G1 E-2 F2400 +{endif} +M84 E +G29 P9 X10 Y-4 W32 H4 +{if first_layer_bed_temperature[initial_tool]<=60}M106 S100{endif} +G0 Z40 F10000 +M190 S[first_layer_bed_temperature] +M107 +M84 E +G29 P1 +G29 P1 X0 Y0 W50 H20 C +G29 P3.2 +G29 P3.13 +G29 A +M104 S{first_layer_temperature[0]} +G0 X0 Y-4 Z15 F4800 +M109 S{first_layer_temperature[0]} +G92 E0 +M569 S0 E +G92 E0 +G1 E{(filament_type[0] == "FLEX" ? 4 : 2)} F2400 +G0 E7 X15 Z0.2 F500 +G0 X25 E4 F500 +G0 X35 E4 F650 +G0 X45 E4 F800 +G0 X{45 + 3} Z{0.05} F{8000} +G0 X{45 + 3 * 2} Z0.2 F{8000} +G92 E0 +M221 S100 +""" + +end_gcode = """ +{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+1, max_print_height)} F720{endif} +M104 S0 +M140 S0 +M107 +G1 X241 Y170 F3600 +{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+23, max_print_height)} F300{endif} +G4 +M572 S0 +M593 X T2 F0 +M593 Y T2 F0 +M84 X Y E +""" + +error_code = '' +err_code ='' + +def slice_stl(file_path, output_dir, options=None): + """ + STL 파일을 PrusaSlicer를 사용하여 슬라이스하는 함수 + """ + # PrusaSlicer 명령어 생성 + prusa_slicer_path = '/usr/bin/PrusaSlicer' + + command = [ + prusa_slicer_path, '-g', + ] + + # 옵션 추가 + for key, value in options.items(): + command.extend([f'--{key}', value]) + + # 파일 경로 추가 + command.append(f'"{file_path}"') + + # 출력 디렉토리는 PrusaSlicer가 인식할 수 있는 형식으로 설정 + command.extend(['-o', output_dir]) + + # skirts가 0일 때 관련 옵션 제거 + if options.get('skirts') == '0': + command = [opt for idx, opt in enumerate(command) if 'skirt' not in opt and (idx == 0 or 'skirt' not in command[idx - 1])] + command = [opt for idx, opt in enumerate(command) if 'skirts' not in opt and (idx == 0 or 'skirts' not in command[idx - 1])] + + # brim-type이 no_brim일 때 관련 옵션 제거 + if options.get('brim_type') == 'no_brim': + command = [opt for idx, opt in enumerate(command) if 'brim' not in opt and (idx == 0 or 'brim' not in command[idx - 1])] + command = [opt for idx, opt in enumerate(command) if 'draft' not in opt and (idx == 0 or 'draft' not in command[idx - 1])] + + + # 이 코드 처리 중에 --support-material 이나 --support-material-auto가 true,false에 따라서 다르게 동작해야 되는데, 둘중 하나 통과하는 부분에서 + # command option이 사라진것 같아 확인 필요 + i = 0 + while i < len(command): + if command[i] == '--support-material' and options.get('support_material') == 'true': + command[i + 1] = '' # Set the next index to empty string + i += 1 # Move to the next index to skip removing '--support-material' + continue + + if command[i] == '--support-material-auto' and options.get('support_material_auto') == 'true': + command[i + 1] = '' # Set the next index to empty string + i += 1 # Move to the next index to skip removing '--support-material-auto' + continue + + if command[i] == '--support-material' and options.get('support_material') == 'false': + command.pop(i) # Remove '--support-material' + command.pop(i) # Remove the value after '--support-material' + continue + + + if command[i] == '--support-material-auto' and options.get('support_material_auto') == 'false': + command.pop(i) # Remove '--support-material-auto' + command.pop(i) # Remove the value after '--support-material-auto' + continue + + i += 1 + + #app.logger.debug("command : %s", ' '.join(command)) + + try: + result = subprocess.run(' '.join(command), shell=True, capture_output=True, text=True, check=True) + app.logger.debug("PrusaSlicer output: %s", result.stdout) + return True + except subprocess.CalledProcessError as e: + app.logger.error("PrusaSlicer error: %s", e.stderr) + global error_code + error_code = e.stderr + return False + +def parse_slicing_error(error_code): + error_patterns = { + "There is an object with no extrusions in the first layer.": (401, "첫 번째 레이어에 압출물이 없는 객체가 있습니다."), + "No extrusions were generated for objects.": (402, "객체에 대한 압출물이 생성되지 않았습니다."), + "The print is empty. The model is not printable with current print settings.": (403, "출력이 비어 있습니다. 현재 인쇄 설정으로는 모델을 인쇄할 수 없습니다."), + "Levitating objects cannot be printed without supports.": (404, "떠있는 객체는 지지대 없이 인쇄할 수 없습니다."), + "No layers were detected. You might want to repair your STL file(s) or check their size or thickness and retry.": (405, "레이어가 감지되지 않았습니다. STL 파일을 수리하거나 크기 또는 두께를 확인하고 다시 시도해 보십시오."), + "No pad can be generated for this model with the current configuration": (406, "현재 설정으로는 이 모델에 대해 패드를 생성할 수 없습니다."), + "There are unprintable objects. Try to adjust support settings to make the objects printable.": (407, "인쇄할 수 없는 객체가 있습니다. 객체를 인쇄 가능하게 만들기 위해 지지대 설정을 조정해 보십시오.") + } + + for pattern, (code, message) in error_patterns.items(): + if pattern in error_code: + return code, message + + # 기본 에러 메시지 + return 400, "모델 슬라이스에 실패했습니다." + +@app.route('/slice', methods=['POST']) +def slice_model(): + global error_code + upload_dir = '/home/gds/printer/stl' + if not os.path.exists(upload_dir): + os.makedirs(upload_dir) + # 1. file 없을 시 에러 발생 + file = request.files.get('file') + if not file: + # STL 파일을 저장할 경로 설정 + #2. file이 없어도 was에서 저장시킨 원래 파일명이 있을시 + if 'orignlFileNm' in request.form and request.form['orignlFileNm']: + file_path = os.path.join(upload_dir, request.form['orignlFileNm']) + #3. 저장 경로 + 파일명이 존재하지 않을 시 + if not os.path.exists(file_path): + app.logger.error('No file in filepath') + return jsonify({'err_code': '200','err_title':'경로상 파일 존재하지 않음','err_msg':'파일이 현재 경로 상에 존재하지 않습니다(/home/gds/printer)'}) + else: + app.logger.error('No file part') + return jsonify({'err_code': '100','err_title':'업로드 파일 없음','err_msg':'업로드될 파일이 존재하지 않습니다.'}) + else: + file_extension = os.path.splitext(file.filename)[1].lower() + if file_extension != '.stl': + app.logger.error('Invalid file type: %s', file_extension) + return jsonify({'err_code': '300','err_title':'확장자가 다름','err_msg':'STL 파일만 업로드 가능합니다.'}) + + file_path = os.path.join(upload_dir, file.filename) + file.save(file_path) + app.logger.debug('File saved to %s', file_path) + + #form으로 부터 dictionary 형태로 가지고 옴 + options = request.form.to_dict() + + keys_to_remove = ['options_select_printer','options_select_filament', 'preset-options','wipe-tower-adjustment','menuId','orId','prId','atchFileId1','pageIndex','_csrf','orignlFileNm','atchFileId'] + for key in keys_to_remove: + if key in options: + del options[key] + + options['filament-colour'] = '"'+options['filament-colour']+'"' + options['fill-density'] = options['fill-density'] + "%" + + # 값이 "on"인 항목을 ""로 변경 + for key, value in options.items(): + if value == 'on' or value == 'true' or value == 'false' : + options[key] = '' + + #start-gcode, end-gcode 추가 + options['start-gcode'] = f"'{start_gcode}'" + options['end-gcode'] = f"'{end_gcode}'" + + # PrusaSlicer를 사용하여 STL 파일 슬라이스 + output_dir = '/home/gds/printer/gcode/' + if not os.path.exists(output_dir): + os.makedirs(output_dir) + + success = slice_stl(file_path, output_dir, options) + + if success: + # G-code 파일 경로 + if not file: + gcode_file_path = os.path.join(output_dir,os.path.splitext(request.form['orignlFileNm'])[0]+ '.gcode') + return jsonify({'gcode_file_path': gcode_file_path}) + else: + gcode_file_path = os.path.join(output_dir, os.path.splitext(file.filename)[0] + '.gcode') + return jsonify({'gcode_file_path': gcode_file_path}) + else: + error_code, error_message = parse_slicing_error(error_code) + return jsonify({'err_code': error_code,'err_title':'슬라이스 에러','err_msg': error_message}) + +@app.route('/getGCodeFile', methods=['GET']) +def get_gcode_file(): + gcode_file_path = request.args.get('gcodeFilePath') + if not gcode_file_path: + return jsonify({'error': 'Missing gcode_file_path parameter'}) + + try: + with open(gcode_file_path, 'r') as file: + gcode_string = file.read() + + return gcode_string + except FileNotFoundError: + return jsonify({'error': 'File not found'}) + +@app.route('/getPrusaConfig', methods=['GET']) +def get_prusa_config(): + config = { + 'printer1': { + 'url': os.getenv('PRUSA_PRINTER1_API_URL'), + 'api_key': os.getenv('PRUSA_PRINTER1_API_KEY') + }, + 'printer2': { + 'url': os.getenv('PRUSA_PRINTER2_API_URL'), + 'api_key': os.getenv('PRUSA_PRINTER2_API_KEY') + } + } + return jsonify(config) + +@app.route('/proxy', methods=['GET', 'POST', 'PUT', 'DELETE']) +def proxy_prusa_link(): + try: + # 요청 URL과 파라미터 설정 + url = request.args.get('url') + if not url: + return Response("URL is required", status=400) + + # PrusaLink에 보낼 요청 설정 + headers = {key: value for key, value in request.headers.items() if key != 'Host'} + response = requests.request( + method=request.method, + url=url, + headers=headers, + data=request.get_data(), + cookies=request.cookies, + stream=True # 스트리밍 응답 처리 + ) + + # PrusaLink에서 받은 스트리밍 응답을 클라이언트에 전달 + def generate(): + for chunk in response.iter_content(chunk_size=8192): + yield chunk + + proxy_response = Response(stream_with_context(generate()), status=response.status_code) + for key, value in response.headers.items(): + if key.lower() != 'content-encoding' and key.lower() != 'transfer-encoding': + proxy_response.headers[key] = value + + return proxy_response + except Exception as e: + return Response(f"An error occurred: {str(e)}", status=500) + +if __name__ == '__main__': + app.run(host='0.0.0.0', port=3000, debug=True) \ No newline at end of file diff --git a/1_infrastructure/docker/docker_3dp/printer/requirements.txt b/1_infrastructure/docker/docker_3dp/printer/requirements.txt new file mode 100644 index 0000000000000000000000000000000000000000..77b8482fc94bd7a001f4805fd3afe48398adf97e --- /dev/null +++ b/1_infrastructure/docker/docker_3dp/printer/requirements.txt @@ -0,0 +1,4 @@ +Flask +Flask-Cors +python-dotenv +requests \ No newline at end of file diff --git a/1_infrastructure/docker/docker_3dp/printer/slicer_test.py b/1_infrastructure/docker/docker_3dp/printer/slicer_test.py new file mode 100644 index 0000000000000000000000000000000000000000..898214538677abb8ec9cf97780de0fdb7a885dca --- /dev/null +++ b/1_infrastructure/docker/docker_3dp/printer/slicer_test.py @@ -0,0 +1,337 @@ +import subprocess + +def slice_stl(file_path, output_dir, options=None): + """ + STL 파일을 PrusaSlicer를 사용하여 슬라이스하는 함수 + """ + + command = [ + 'PrusaSlicer', '-g' + ] + + # 옵션 추가 + for key, value in options.items(): + command.extend([f'--{key}', value]) + + # 파일 경로 추가 + command.append(' '+file_path) + + # 출력 디렉토리는 PrusaSlicer가 인식할 수 있는 형식으로 설정 + command.extend(['-o', output_dir]) + + try: + result = subprocess.run(' '.join(command), shell=True, capture_output=True, text=True, check=True) + print("PrusaSlicer output:", result.stdout) + return True + except subprocess.CalledProcessError as e: + print("PrusaSlicer error:", e.stderr) + return False + +# STL 파일 경로 및 출력 디렉토리 설정 +stl_file = '/home/gds/printer/stl/A30_3D_Flexi_Dragon.stl' +output_directory = '/home/gds/printer/gcode' + +start_gcode = """ +M17 +M862.1 P[nozzle_diameter] +M862.3 P "MK4" +M862.5 P2 +M862.6 P "Input shaper" +M115 U6.0.1+14848 +M555 X{(min(print_bed_max[0], first_layer_print_min[0] + 32) - 32)} Y{(max(0, first_layer_print_min[1]) - 4)} +W{((min(print_bed_max[0], max(first_layer_print_min[0] + 32, first_layer_print_max[0])))) - ((min(print_bed_max[0], first_layer_print_min[0] + 32) - 32))} H{((first_layer_print_max[1])) - ((max(0, first_layer_print_min[1]) - 4))} +G90 +M83 +M140 S[first_layer_bed_temperature] + +{if filament_notes[0]=~/.*HT_MBL10.*/} +M104 T0 S{first_layer_temperature[0] - 10} +M109 T0 R{first_layer_temperature[0] - 10} +{endif} + +{if filament_type[0] == "PC" or filament_type[0] == "PA"} +M104 T0 S{first_layer_temperature[0] - 25} +M109 T0 R{first_layer_temperature[0] - 25} +{endif} + +{if filament_type[0] == "FLEX"} +M104 T0 S210 +M109 T0 R210 +{endif} + +{if filament_type[0]=~/.*PET.*/} +M104 T0 S175 +M109 T0 R175 +{endif} + +{if not (filament_notes[0]=~/.*HT_MBL10.*/ or filament_type[0] == "PC" or filament_type[0] == "PA" or filament_type[0] == "FLEX" or filament_type[0]=~/.*PET.*/)} +M104 T0 S170 +M109 T0 R170 +{endif} + +M84 E +G28 +G1 X{10 + 32} Y-4 Z5 F4800 +M302 S160 +{if filament_type[initial_tool]=="FLEX"} +G1 E-4 F2400 +{else} +G1 E-2 F2400 +{endif} +M84 E +G29 P9 X10 Y-4 W32 H4 +{if first_layer_bed_temperature[initial_tool]<=60}M106 S100{endif} +G0 Z40 F10000 +M190 S[first_layer_bed_temperature] +M107 +M84 E +G29 P1 +G29 P1 X0 Y0 W50 H20 C +G29 P3.2 +G29 P3.13 +G29 A +M104 S{first_layer_temperature[0]} +G0 X0 Y-4 Z15 F4800 +M109 S{first_layer_temperature[0]} +G92 E0 +M569 S0 E +G92 E0 +G1 E{(filament_type[0] == "FLEX" ? 4 : 2)} F2400 +G0 E7 X15 Z0.2 F500 +G0 X25 E4 F500 +G0 X35 E4 F650 +G0 X45 E4 F800 +G0 X{45 + 3} Z{0.05} F{8000} +G0 X{45 + 3 * 2} Z0.2 F{8000} +G92 E0 +M221 S100 +""" + +end_gcode = """ +{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+1, max_print_height)} F720{endif} +M104 S0 +M140 S0 +M107 +G1 X241 Y170 F3600 +{if layer_z < max_print_height}G1 Z{z_offset+min(layer_z+23, max_print_height)} F300{endif} +G4 +M572 S0 +M593 X T2 F0 +M593 Y T2 F0 +M84 X Y E +""" + +# PrusaSlicer 슬라이스 옵션 설정 +options = { + 'start-gcode': f"'{start_gcode}'", + 'end-gcode': f"'{end_gcode}'", + 'layer-height': '0.1', + 'first-layer-height': '0.2', + 'perimeters': '3', + 'top-solid-layers': '8', + 'bottom-solid-layers': '6', + 'top-solid-min-thickness': '0.7', + 'bottom-solid-min-thickness': '0.5', + 'extra-perimeters': '', + 'extra-perimeters-on-overhangs': '', + 'avoid-crossing-perimeters': '', + 'avoid-crossing-perimeters-max-detour': '1', + 'thick-bridges': '', + 'overhangs': '', + 'seam-position': 'aligned', + 'staggered-inner-seams': '', + 'external-perimeters-first': '', + 'gap-fill-enabled': '', + 'perimeter-generator': 'arachne', + 'fuzzy-skin': 'none', + 'fuzzy-skin-thickness': '0.3', + 'fuzzy-skin-point-dist': '0.8', + 'fill-density': '15%', + 'fill-pattern': 'grid', + 'infill-anchor': '2', + 'infill-anchor-max': '12', + 'top-fill-pattern': 'monotoniclines', + 'bottom-fill-pattern': 'monotoniclines', + 'ironing': '', + 'ironing-type': 'top', + 'ironing-flowrate': '15', + 'ironing-spacing': '0.1', + 'infill-every-layers': '1', + 'solid-infill-every-layers': '0', + 'fill-angle': '45', + 'solid-infill-below-area': '0', + 'bridge-angle': '0', + 'only-retract-when-crossing-perimeters': '', + 'infill-first': '', + 'skirts': '1', + 'skirt-distance': '6', + 'skirt-height': '1', + 'draft-shield': 'limited', + 'min-skirt-length': '4', + 'brim-type': 'outer_only', + 'brim-width': '0', + 'brim-separation': '0.1', + 'support-material': '', + 'support-material-auto': '', + 'support-material-threshold': '40', + 'support-material-enforce-layers': '0', + 'raft-first-layer-density': '80', + 'raft-first-layer-expansion': '3.5', + 'raft-layers': '0', + 'raft-contact-distance': '0.15', + 'raft-expansion': '1.5', + 'support-material-style': 'snug', + 'support-material-contact-distance': '0.17', + 'support-material-bottom-contact-distance': '0.17', + 'support-material-pattern': 'rectilinear', + 'support-material-with-sheath': '', + 'support-material-spacing': '2', + 'support-material-angle': '0', + 'support-material-closing-radius': '2', + 'support-material-interface-layers': '5', + 'support-material-bottom-interface-layers': '5', + 'support-material-interface-pattern': 'auto', + 'support-material-interface-spacing': '0.2', + 'support-material-interface-contact-loops': '', + 'support-material-buildplate-only': '', + 'support-material-xy-spacing': '0.8', + 'dont-support-bridges': '', + 'support-material-synchronize-layers': '', + 'support-tree-angle': '40', + 'support-tree-angle-slow': '25', + 'support-tree-branch-diameter': '2', + 'support-tree-branch-diameter-angle': '5', + 'support-tree-branch-diameter-double-wall': '3', + 'support-tree-tip-diameter': '0.8', + 'support-tree-branch-distance': '1', + 'support-tree-top-rate': '30', + 'perimeter-speed': '140', + 'small-perimeter-speed': '140', + 'external-perimeter-speed': '140', + 'infill-speed': '140', + 'solid-infill-speed': '200', + 'top-solid-infill-speed': '100', + 'support-material-speed': '120', + 'support-material-interface-speed': '50', + 'bridge-speed': '40', + 'gap-fill-speed': '120', + 'ironing-speed': '15', + 'enable-dynamic-overhang-speeds': '', + 'overhang-speed-0': '15', + 'overhang-speed-1': '25', + 'overhang-speed-2': '30', + 'overhang-speed-3': '80', + 'travel-speed': '300', + 'travel-speed-z': '12', + 'first-layer-speed': '40', + 'first-layer-speed-over-raft': '150', + 'external-perimeter-acceleration': '2000', + 'perimeter-acceleration': '2500', + 'top-solid-infill-acceleration': '1500', + 'solid-infill-acceleration': '3500', + 'infill-acceleration': '4000', + 'bridge-acceleration': '3500', + 'first-layer-acceleration': '500', + 'wipe-tower-acceleration': '0', + 'travel-acceleration': '4000', + 'default-acceleration': '3000', + 'max-print-speed': '200', + 'max-volumetric-speed': '0', + 'max-volumetric-extrusion-rate-slope-positive': '0', + 'max-volumetric-extrusion-rate-slope-negative': '0', + 'perimeter-extruder': '1', + 'infill-extruder': '1', + 'solid-infill-extruder': '1', + 'support-material-extruder': '0', + 'support-material-interface-extruder': '0', + 'ooze-prevention': '', + 'standby-temperature-delta': '-5', + 'wipe-tower-x': '180', + 'wipe-tower-y': '140', + 'wipe-tower-width': '60', + 'wipe-tower-rotation-angle': '0', + 'wipe-tower-brim-width': '2', + 'wipe-tower-bridging': '10', + 'wipe-tower-cone-angle': '25', + 'wipe-tower-extra-spacing': '110', + 'wipe-tower-extra-flow': '250', + 'wipe-tower-no-sparse-layers': '', + 'interface-shells': '', + 'mmu-segmented-region-max-width': '0', + 'mmu-segmented-region-interlocking-depth': '0', + 'extrusion-width': '0.45', + 'first-layer-extrusion-width': '0.5', + 'perimeter-extrusion-width': '0.45', + 'external-perimeter-extrusion-width': '0.45', + 'infill-extrusion-width': '0.45', + 'solid-infill-extrusion-width': '0.45', + 'top-infill-extrusion-width': '0.4', + 'support-material-extrusion-width': '0.39', + 'infill-overlap': '0.15', + 'bridge-flow-ratio': '1', + 'slice-closing-radius': '0.049', + 'slicing-mode': 'regular', + 'resolution': '0', + 'gcode-resolution': '0.008', + 'arc-fitting': 'emit_center', + 'xy-size-compensation': '0', + 'elefant-foot-compensation': '0.2', + 'wall-transition-angle': '10', + 'wall-transition-filter-deviation': '25%', + 'wall-transition-length': '100%', + 'wall-distribution-count': '1', + 'min-bead-width': '85%', + 'min-feature-size': '25%', + 'filament-colour': '"#29B2B2"', + 'filament-diameter': '1.75', + 'extrusion-multiplier': '1', + 'filament-density': '1.24', + 'filament-cost': '25.4', + 'filament-spool-weight': '0', + 'idle-temperature': '70', + 'first-layer-temperature': '230', + 'temperature': '220', + 'first-layer-bed-temperature': '60', + 'bed-temperature': '60', + 'fan-always-on': '', + 'cooling': '', + 'min-fan-speed': '100', + 'max-fan-speed': '100', + 'bridge-fan-speed': '100', + 'disable-fan-first-layers': '1', + 'full-fan-speed-layer': '0', + 'enable-dynamic-fan-speeds': '', + 'overhang-fan-speed-0': '0', + 'overhang-fan-speed-1': '0', + 'overhang-fan-speed-2': '0', + 'overhang-fan-speed-3': '0', + 'fan-below-layer-time': '100', + 'slowdown-below-layer-time': '8', + 'min-print-speed': '15', + 'filament-max-volumetric-speed': '15', + 'filament-minimal-purge-on-wipe-tower': '15', + 'filament-loading-speed-start': '50', + 'filament-loading-speed': '10', + 'filament-unloading-speed-start': '100', + 'filament-unloading-speed': '100', + 'filament-load-time': '10.5', + 'filament-unload-time': '8.5', + 'filament-toolchange-delay': '0', + 'filament-cooling-moves': '2', + 'filament-cooling-initial-speed': '10', + 'filament-cooling-final-speed': '3.5', + 'filament-stamping-loading-speed': '29', + 'filament-stamping-distance': '45', + 'filament-purge-multiplier': '81.25', + 'filament-multitool-ramming': '', + 'filament-multitool-ramming-volume': '10', + 'filament-multitool-ramming-flow': '10', + } + +# STL 파일 슬라이스 실행 +success = slice_stl(stl_file, output_directory,options=options) + +if success: + print("STL 파일을 성공적으로 슬라이스했습니다.") +else: + print("STL 파일 슬라이스 중 오류가 발생했습니다.") \ No newline at end of file diff --git a/docker/docker_3dp/rebuild_docker.sh b/1_infrastructure/docker/docker_3dp/rebuild_docker.sh similarity index 100% rename from docker/docker_3dp/rebuild_docker.sh rename to 1_infrastructure/docker/docker_3dp/rebuild_docker.sh diff --git a/docker/docker_3dp/setting.sql b/1_infrastructure/docker/docker_3dp/setting.sql similarity index 100% rename from docker/docker_3dp/setting.sql rename to 1_infrastructure/docker/docker_3dp/setting.sql diff --git a/docker/docker_3dp/sites-available/default b/1_infrastructure/docker/docker_3dp/sites-available/default similarity index 100% rename from docker/docker_3dp/sites-available/default rename to 1_infrastructure/docker/docker_3dp/sites-available/default diff --git a/docker/docker_3dp/sites-available/nextcloud.conf b/1_infrastructure/docker/docker_3dp/sites-available/nextcloud.conf similarity index 100% rename from docker/docker_3dp/sites-available/nextcloud.conf rename to 1_infrastructure/docker/docker_3dp/sites-available/nextcloud.conf diff --git a/docker/docker_3dp/start_service.sh b/1_infrastructure/docker/docker_3dp/start_service.sh similarity index 100% rename from docker/docker_3dp/start_service.sh rename to 1_infrastructure/docker/docker_3dp/start_service.sh diff --git a/docker/docker_all/Dockerfile b/1_infrastructure/docker/docker_all/Dockerfile similarity index 100% rename from docker/docker_all/Dockerfile rename to 1_infrastructure/docker/docker_all/Dockerfile diff --git a/docker/docker_all/README.md b/1_infrastructure/docker/docker_all/README.md similarity index 100% rename from docker/docker_all/README.md rename to 1_infrastructure/docker/docker_all/README.md diff --git a/docker/docker_all/docker-compose.yml b/1_infrastructure/docker/docker_all/docker-compose.yml similarity index 100% rename from docker/docker_all/docker-compose.yml rename to 1_infrastructure/docker/docker_all/docker-compose.yml diff --git a/docker/docker_all/rebuild_docker.sh b/1_infrastructure/docker/docker_all/rebuild_docker.sh similarity index 100% rename from docker/docker_all/rebuild_docker.sh rename to 1_infrastructure/docker/docker_all/rebuild_docker.sh diff --git a/docker/docker_all/setting.sql b/1_infrastructure/docker/docker_all/setting.sql similarity index 100% rename from docker/docker_all/setting.sql rename to 1_infrastructure/docker/docker_all/setting.sql diff --git a/docker/docker_all/start_service.sh b/1_infrastructure/docker/docker_all/start_service.sh similarity index 100% rename from docker/docker_all/start_service.sh rename to 1_infrastructure/docker/docker_all/start_service.sh diff --git a/docker/docker_centos/Dockerfile b/1_infrastructure/docker/docker_centos/Dockerfile similarity index 100% rename from docker/docker_centos/Dockerfile rename to 1_infrastructure/docker/docker_centos/Dockerfile diff --git a/docker/docker_centos/Dockerfile_centos b/1_infrastructure/docker/docker_centos/Dockerfile_centos similarity index 100% rename from docker/docker_centos/Dockerfile_centos rename to 1_infrastructure/docker/docker_centos/Dockerfile_centos diff --git a/docker/docker_centos/README.md b/1_infrastructure/docker/docker_centos/README.md similarity index 100% rename from docker/docker_centos/README.md rename to 1_infrastructure/docker/docker_centos/README.md diff --git a/docker/docker_centos/docker-compose-centos.yml b/1_infrastructure/docker/docker_centos/docker-compose-centos.yml similarity index 100% rename from docker/docker_centos/docker-compose-centos.yml rename to 1_infrastructure/docker/docker_centos/docker-compose-centos.yml diff --git a/docker/docker_centos/docker-compose.yml b/1_infrastructure/docker/docker_centos/docker-compose.yml similarity index 100% rename from docker/docker_centos/docker-compose.yml rename to 1_infrastructure/docker/docker_centos/docker-compose.yml diff --git a/docker/docker_centos/httpd.conf b/1_infrastructure/docker/docker_centos/httpd.conf similarity index 100% rename from docker/docker_centos/httpd.conf rename to 1_infrastructure/docker/docker_centos/httpd.conf diff --git a/docker/docker_centos/my.cnf b/1_infrastructure/docker/docker_centos/my.cnf similarity index 100% rename from docker/docker_centos/my.cnf rename to 1_infrastructure/docker/docker_centos/my.cnf diff --git a/docker/docker_centos/php.ini b/1_infrastructure/docker/docker_centos/php.ini similarity index 100% rename from docker/docker_centos/php.ini rename to 1_infrastructure/docker/docker_centos/php.ini diff --git a/docker/docker_centos/rebuild_docker.sh b/1_infrastructure/docker/docker_centos/rebuild_docker.sh similarity index 100% rename from docker/docker_centos/rebuild_docker.sh rename to 1_infrastructure/docker/docker_centos/rebuild_docker.sh diff --git a/docker/docker_centos/setting.sql b/1_infrastructure/docker/docker_centos/setting.sql similarity index 100% rename from docker/docker_centos/setting.sql rename to 1_infrastructure/docker/docker_centos/setting.sql diff --git a/docker/docker_centos/sshd_config b/1_infrastructure/docker/docker_centos/sshd_config similarity index 100% rename from docker/docker_centos/sshd_config rename to 1_infrastructure/docker/docker_centos/sshd_config diff --git a/docker/docker_centos/start_service.sh b/1_infrastructure/docker/docker_centos/start_service.sh similarity index 100% rename from docker/docker_centos/start_service.sh rename to 1_infrastructure/docker/docker_centos/start_service.sh diff --git a/docker/docker_centos_desktop/Dockerfile b/1_infrastructure/docker/docker_centos_desktop/Dockerfile similarity index 100% rename from docker/docker_centos_desktop/Dockerfile rename to 1_infrastructure/docker/docker_centos_desktop/Dockerfile diff --git a/docker/docker_centos_desktop/README.md b/1_infrastructure/docker/docker_centos_desktop/README.md similarity index 100% rename from docker/docker_centos_desktop/README.md rename to 1_infrastructure/docker/docker_centos_desktop/README.md diff --git a/docker/docker_centos_desktop/docker-compose.yml b/1_infrastructure/docker/docker_centos_desktop/docker-compose.yml similarity index 100% rename from docker/docker_centos_desktop/docker-compose.yml rename to 1_infrastructure/docker/docker_centos_desktop/docker-compose.yml diff --git a/docker/docker_centos_desktop/httpd.conf b/1_infrastructure/docker/docker_centos_desktop/httpd.conf similarity index 100% rename from docker/docker_centos_desktop/httpd.conf rename to 1_infrastructure/docker/docker_centos_desktop/httpd.conf diff --git a/docker/docker_centos_desktop/my.cnf b/1_infrastructure/docker/docker_centos_desktop/my.cnf similarity index 100% rename from docker/docker_centos_desktop/my.cnf rename to 1_infrastructure/docker/docker_centos_desktop/my.cnf diff --git a/docker/docker_centos_desktop/php.ini b/1_infrastructure/docker/docker_centos_desktop/php.ini similarity index 100% rename from docker/docker_centos_desktop/php.ini rename to 1_infrastructure/docker/docker_centos_desktop/php.ini diff --git a/docker/docker_centos_desktop/rebuild_docker.sh b/1_infrastructure/docker/docker_centos_desktop/rebuild_docker.sh similarity index 100% rename from docker/docker_centos_desktop/rebuild_docker.sh rename to 1_infrastructure/docker/docker_centos_desktop/rebuild_docker.sh diff --git a/docker/docker_centos_desktop/setting.sql b/1_infrastructure/docker/docker_centos_desktop/setting.sql similarity index 100% rename from docker/docker_centos_desktop/setting.sql rename to 1_infrastructure/docker/docker_centos_desktop/setting.sql diff --git a/docker/docker_centos_desktop/sshd_config b/1_infrastructure/docker/docker_centos_desktop/sshd_config similarity index 100% rename from docker/docker_centos_desktop/sshd_config rename to 1_infrastructure/docker/docker_centos_desktop/sshd_config diff --git a/docker/docker_centos_desktop/ssl.conf b/1_infrastructure/docker/docker_centos_desktop/ssl.conf similarity index 100% rename from docker/docker_centos_desktop/ssl.conf rename to 1_infrastructure/docker/docker_centos_desktop/ssl.conf diff --git a/docker/docker_centos_desktop/start_service.sh b/1_infrastructure/docker/docker_centos_desktop/start_service.sh similarity index 100% rename from docker/docker_centos_desktop/start_service.sh rename to 1_infrastructure/docker/docker_centos_desktop/start_service.sh diff --git a/docker/docker_centos_desktop/test-installation.pl b/1_infrastructure/docker/docker_centos_desktop/test-installation.pl similarity index 100% rename from docker/docker_centos_desktop/test-installation.pl rename to 1_infrastructure/docker/docker_centos_desktop/test-installation.pl diff --git a/docker/docker_crowling/Dockerfile b/1_infrastructure/docker/docker_crowling/Dockerfile similarity index 100% rename from docker/docker_crowling/Dockerfile rename to 1_infrastructure/docker/docker_crowling/Dockerfile diff --git a/docker/docker_crowling/README.md b/1_infrastructure/docker/docker_crowling/README.md similarity index 100% rename from docker/docker_crowling/README.md rename to 1_infrastructure/docker/docker_crowling/README.md diff --git a/docker/docker_crowling/docker-compose.yml b/1_infrastructure/docker/docker_crowling/docker-compose.yml similarity index 100% rename from docker/docker_crowling/docker-compose.yml rename to 1_infrastructure/docker/docker_crowling/docker-compose.yml diff --git a/docker/docker_crowling/rebuild.sh b/1_infrastructure/docker/docker_crowling/rebuild.sh similarity index 100% rename from docker/docker_crowling/rebuild.sh rename to 1_infrastructure/docker/docker_crowling/rebuild.sh diff --git a/docker/docker_db/Dockerfile b/1_infrastructure/docker/docker_db/Dockerfile similarity index 100% rename from docker/docker_db/Dockerfile rename to 1_infrastructure/docker/docker_db/Dockerfile diff --git a/docker/docker_db/README.md b/1_infrastructure/docker/docker_db/README.md similarity index 100% rename from docker/docker_db/README.md rename to 1_infrastructure/docker/docker_db/README.md diff --git a/docker/docker_db/docker-compose.yml b/1_infrastructure/docker/docker_db/docker-compose.yml similarity index 100% rename from docker/docker_db/docker-compose.yml rename to 1_infrastructure/docker/docker_db/docker-compose.yml diff --git a/docker/docker_db/make_root_remote_host.sh b/1_infrastructure/docker/docker_db/make_root_remote_host.sh similarity index 100% rename from docker/docker_db/make_root_remote_host.sh rename to 1_infrastructure/docker/docker_db/make_root_remote_host.sh diff --git a/docker/docker_db/rebuild.sh b/1_infrastructure/docker/docker_db/rebuild.sh similarity index 100% rename from docker/docker_db/rebuild.sh rename to 1_infrastructure/docker/docker_db/rebuild.sh diff --git a/docker/docker_db/setting.sql b/1_infrastructure/docker/docker_db/setting.sql similarity index 100% rename from docker/docker_db/setting.sql rename to 1_infrastructure/docker/docker_db/setting.sql diff --git a/docker/docker_db_new/Dockerfile b/1_infrastructure/docker/docker_db_new/Dockerfile similarity index 100% rename from docker/docker_db_new/Dockerfile rename to 1_infrastructure/docker/docker_db_new/Dockerfile diff --git a/docker/docker_db_new/README.md b/1_infrastructure/docker/docker_db_new/README.md similarity index 100% rename from docker/docker_db_new/README.md rename to 1_infrastructure/docker/docker_db_new/README.md diff --git a/docker/docker_db_new/docker-compose.yml b/1_infrastructure/docker/docker_db_new/docker-compose.yml similarity index 100% rename from docker/docker_db_new/docker-compose.yml rename to 1_infrastructure/docker/docker_db_new/docker-compose.yml diff --git a/docker/docker_db_new/make_root_remote_host.sh b/1_infrastructure/docker/docker_db_new/make_root_remote_host.sh similarity index 100% rename from docker/docker_db_new/make_root_remote_host.sh rename to 1_infrastructure/docker/docker_db_new/make_root_remote_host.sh diff --git a/docker/docker_db_new/rebuild.sh b/1_infrastructure/docker/docker_db_new/rebuild.sh similarity index 100% rename from docker/docker_db_new/rebuild.sh rename to 1_infrastructure/docker/docker_db_new/rebuild.sh diff --git a/docker/docker_db_new/setting.sql b/1_infrastructure/docker/docker_db_new/setting.sql similarity index 100% rename from docker/docker_db_new/setting.sql rename to 1_infrastructure/docker/docker_db_new/setting.sql diff --git a/1_infrastructure/docker/docker_fastapi/.gitignore b/1_infrastructure/docker/docker_fastapi/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..45b4e55dc2cbc47a64ac37d3300e8b0f707ec478 --- /dev/null +++ b/1_infrastructure/docker/docker_fastapi/.gitignore @@ -0,0 +1,79 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# Virtual Environment +venv/ +env/ +ENV/ +env.bak/ +venv.bak/ + +# IDE +.vscode/ +.idea/ +*.swp +*.swo +*~ + +# Logs +logs/ +*.log + +# Database +*.db +*.sqlite3 + +# Cache +.pytest_cache/ +.cache/ + +# Chrome/Selenium +chromedriver +*.deb + +# OS +.DS_Store +Thumbs.db + +# Docker +.dockerignore + +# Temporary files +tmp/ +temp/ +*.tmp + +# Jupyter Notebooks +.ipynb_checkpoints + +# Environment variables +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# Backup files +backup_*/ +*.backup \ No newline at end of file diff --git a/1_infrastructure/docker/docker_fastapi/Dockerfile b/1_infrastructure/docker/docker_fastapi/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..d0110c46d1b5ea00815600a3ee5432ebdab62614 --- /dev/null +++ b/1_infrastructure/docker/docker_fastapi/Dockerfile @@ -0,0 +1,83 @@ +FROM ubuntu:22.04 + +# 관련 패키지 설치 +RUN apt-get update && apt-get install -y mecab libmecab-dev mecab-ipadic-utf8 vim gcc g++ python3.10 python3-pip locales + +RUN localedef -f UTF-8 -i ko_KR ko_KR.UTF-8 +ENV LC_ALL ko_KR.UTF-8 +ENV PYTHONIOENCODING=utf-8 + +# jdk 설치 +RUN apt-get install -y openjdk-8-jdk + +# eunjeon 패키지 따로 설치 +RUN pip install eunjeon + +# jdk 설정 +RUN echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >> /etc/profile && \ + echo "export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar" >> /etc/profile && \ + echo "export LANG=ko_KR.UTF-8" >> /etc/profile + +WORKDIR /fastapi +# 이미지 내부에 필요한 파일을 복사 +COPY ./fastapi . + +RUN apt-get update && \ + apt-get install -y \ + wget \ + curl \ + gnupg \ + unzip \ + jq \ + libu2f-udev \ + libappindicator3-1 \ + libasound2 \ + libatk-bridge2.0-0 \ + libatk1.0-0 \ + libcups2 \ + libdbus-1-3 \ + libgtk-3-0 \ + libnspr4 \ + libnss3 \ + libx11-xcb1 \ + libxcomposite1 \ + libxcursor1 \ + libxdamage1 \ + libxfixes3 \ + libxi6 \ + libxrandr2 \ + libxss1 \ + libxtst6 \ + xdg-utils \ + fonts-liberation \ + libgbm1 \ + libvulkan1 \ + && apt-get clean + +# Chrome과 Chromedriver 최신 안정 버전 설치 +RUN LATEST_STABLE_JSON=$(wget -qO- https://googlechromelabs.github.io/chrome-for-testing/last-known-good-versions-with-downloads.json) && \ + CHROME_URL=$(echo $LATEST_STABLE_JSON | jq -r '.channels.Stable.downloads.chrome[] | select(.platform=="linux64") | .url') && \ + DRIVER_URL=$(echo $LATEST_STABLE_JSON | jq -r '.channels.Stable.downloads.chromedriver[] | select(.platform=="linux64") | .url') && \ + wget -O chrome-linux64.zip $CHROME_URL && \ + wget -O chromedriver-linux64.zip $DRIVER_URL && \ + unzip chrome-linux64.zip && \ + unzip chromedriver-linux64.zip && \ + apt-get update && \ + while read pkg; do apt-get satisfy -y --no-install-recommends "${pkg}"; done < chrome-linux64/deb.deps && \ + mv chrome-linux64/chrome /usr/local/bin/google-chrome && \ + mv chromedriver-linux64/chromedriver /usr/local/bin/chromedriver && \ + chmod +x /usr/local/bin/google-chrome && \ + chmod +x /usr/local/bin/chromedriver && \ + rm chrome-linux64.zip chromedriver-linux64.zip && \ + rm -rf chrome-linux64 chromedriver-linux64 + +# 크롬 실행 확인 +RUN google-chrome --version +RUN chromedriver --version + +RUN mkdir -p /dev/shm && chmod 1777 /dev/shm + +RUN pip install --no-cache-dir -r requirements.txt + +#CMD +CMD ["uvicorn", "app.server:app", "--host", "0.0.0.0", "--port", "8000", "--log-level", "trace"] diff --git a/1_infrastructure/docker/docker_fastapi/README.md b/1_infrastructure/docker/docker_fastapi/README.md new file mode 100644 index 0000000000000000000000000000000000000000..71a4658cd22fead9b8b9404a00069c2084fa054e --- /dev/null +++ b/1_infrastructure/docker/docker_fastapi/README.md @@ -0,0 +1,275 @@ +# RECLAR (SABG) 크롤링 & 감성분석 시스템 🚀 + +## 📋 프로젝트 개요 + +RECLAR은 제품별 마케팅 전략 데이터 확보 및 상품개선을 위한 AI 감성분석 시스템입니다. 스마트스토어와 쿠팡에서 상품 정보와 리뷰를 수집하고, 이를 분석하여 마케팅 인사이트를 제공합니다. + +### 🎯 주요 기능 + +- **🔄 동적 마켓 크롤링**: 확장 가능한 아키텍처로 새로운 마켓을 쉽게 추가 +- **📊 실시간 성능 모니터링**: 크롤링 성능을 실시간으로 추적 및 분석 +- **🤖 AI 감성 분석**: 수집된 리뷰 데이터의 감성 분석 +- **📝 구조화된 로깅**: 마켓별 분리된 로그 관리 및 메트릭 수집 +- **🔗 연관 분석**: 상품 및 리뷰 데이터의 연관성 분석 + +--- + +## 🏗 프로젝트 구조 (정리됨) + +``` +docker_fastapi/ +├── 📁 fastapi/ # 메인 FastAPI 애플리케이션 +│ ├── 📁 app/ # 애플리케이션 진입점 +│ ├── 📁 api/ # API 라우터 +│ │ ├── 📁 analysis/ # 데이터 분석 API +│ │ ├── 📁 auth/ # 인증 API +│ │ ├── 📁 crawling/ # 크롤링 API +│ │ └── 📁 monitoring/ # 모니터링 API +│ ├── 📁 core/ # 핵심 비즈니스 로직 +│ │ ├── 📄 crawler_base.py # 공통 크롤링 베이스 클래스 +│ │ ├── 📄 crawler_factory.py # 크롤러 팩토리 패턴 +│ │ ├── 📁 crawlers/ # 마켓별 크롤러 +│ │ ├── 📁 exceptions/ # 예외 처리 +│ │ ├── 📁 middleware/ # 미들웨어 +│ │ └── 📁 utils/ # 유틸리티 +│ ├── 📁 config/ # 설정 파일 +│ │ └── 📁 parsing_rules/ # 파싱 규칙 +│ ├── 📁 databases/ # 데이터베이스 관련 +│ ├── 📁 ml/ # 머신러닝 모델 +│ │ └── 📁 sentiment/ # 감성 분석 +│ ├── 📁 tests/ # 테스트 파일 (정리됨) +│ │ ├── 📁 integration/ # 통합 테스트 +│ │ └── 📁 manual/ # 수동 테스트 +│ ├── 📁 logs/ # 로그 파일 (새로 생성) +│ │ ├── 📁 smartstore/ # 스마트스토어 로그 +│ │ ├── 📁 coupang/ # 쿠팡 로그 +│ │ └── 📁 metrics/ # 성능 메트릭 +│ └── 📁 docs/ # 문서 +├── 📁 assets/ # 바이너리 파일 (새로 생성) +│ └── 📁 chrome/ # Chrome 관련 파일 +│ ├── 📄 chromedriver # 이동됨 +│ └── 📄 google-chrome...deb # 이동됨 +├── 📁 scripts/ # 개발 스크립트 (새로 생성) +│ └── 📄 rebuild.sh # 이동됨 +├── 📁 backup_monitoring/ # 백업된 모니터링 폴더 +├── 📁 venv/ # 파이썬 가상환경 +├── 📄 docker-compose.yml # Docker 설정 +├── 📄 Dockerfile # Docker 이미지 설정 (업데이트됨) +└── 📄 README.md # 프로젝트 문서 (업데이트됨) +``` + +### 🔄 정리된 내용 + +1. **테스트 파일 정리**: + - 루트에 산재되어 있던 테스트 파일들을 `fastapi/tests/` 하위로 이동 + - `integration/` (통합 테스트)와 `manual/` (수동 테스트)로 분류 + +2. **바이너리 파일 정리**: + - Chrome 설치 파일과 chromedriver를 `assets/chrome/`으로 이동 + - Dockerfile에서 경로 업데이트 + +3. **스크립트 정리**: + - 개발 스크립트들을 `scripts/` 디렉토리로 이동 + +4. **로그 디렉토리 생성**: + - 마켓별 로그 관리를 위한 구조 생성 + +5. **중복 폴더 정리**: + - 루트의 `monitoring/` 폴더를 `backup_monitoring/`으로 백업 + +--- + +## 🚀 빠른 시작 + +### 1. 환경 설정 + +```bash +# 저장소 클론 +git clone +cd docker_fastapi + +# 가상환경 활성화 +source venv/bin/activate + +# FastAPI 의존성 설치 +cd fastapi +pip install -r requirements.txt +``` + +### 2. 서버 실행 + +```bash +# Docker Compose 사용 (권장) +docker-compose up -d + +# 또는 직접 실행 +cd fastapi +python main.py + +# 또는 uvicorn으로 실행 +uvicorn app.server:app --host 0.0.0.0 --port 8000 --reload +``` + +### 3. API 문서 확인 + +- **Swagger UI**: http://localhost:8000/docs +- **ReDoc**: http://localhost:8000/redoc + +--- + +## 📚 API 사용 가이드 + +### 🔄 동적 크롤링 API + +#### 지원 마켓 조회 +```bash +GET /crawling/markets +``` + +#### 상품 정보 크롤링 +```bash +GET /crawling/{market}/product?url={상품URL} + +# 예시 +GET /crawling/smartstore/product?url=https://smartstore.naver.com/... +GET /crawling/coupang/product?url=https://www.coupang.com/vp/products/... +``` + +#### 리뷰 정보 크롤링 +```bash +GET /crawling/{market}/reviews?url={상품URL} +``` + +### 📊 성능 모니터링 API + +#### 성능 요약 +```bash +GET /monitoring/performance/summary?market=smartstore +``` + +#### 종합 대시보드 +```bash +GET /monitoring/performance/dashboard?market=smartstore +``` + +#### 시스템 헬스 체크 +```bash +GET /monitoring/performance/health +``` + +--- + +## 🧪 테스트 + +### 테스트 실행 + +```bash +cd fastapi + +# 모든 테스트 실행 +pytest + +# 통합 테스트만 실행 +pytest tests/integration/ + +# 수동 테스트 (개별 실행) +python tests/manual/test_simple_manual.py + +# 특정 마커별 테스트 실행 +pytest -m unit # 유닛 테스트만 +pytest -m integration # 통합 테스트만 +pytest -m manual # 수동 테스트만 + +# 커버리지 포함 실행 +pytest --cov=core --cov-report=html +``` + +### 테스트 구조 + +``` +📁 fastapi/tests/ +├── 📁 integration/ # 통합 테스트 +│ ├── 📄 test_system.py +│ ├── 📄 test_monitoring_system.py +│ └── 📄 test_updated_crawler.py +├── 📁 manual/ # 수동 테스트 +│ ├── 📄 test_simple_manual.py +│ ├── 📄 test_korean_sentiment.py +│ ├── 📄 test_navigate_to_url.py +│ └── 📄 test_coupang_manual.py +├── 📄 test_crawler_base.py # 유닛 테스트 +├── 📄 test_rule_loader.py +├── 📄 test_crawler_factory.py +└── 📄 test_integration.py +``` + +--- + +## 📊 로깅 및 모니터링 + +### 로그 파일 구조 + +``` +📁 fastapi/logs/ +├── 📁 smartstore/ +│ ├── 📄 crawler.log # 일반 로그 +│ └── 📄 error.log # 에러 로그 +├── 📁 coupang/ +│ ├── 📄 crawler.log +│ └── 📄 error.log +└── 📁 metrics/ + ├── 📄 metrics_2024-01-15.jsonl # 일반 메트릭 + └── 📄 performance_2024-01-15.jsonl # 성능 메트릭 +``` + +### 로그 특징 + +- **마켓별 분리**: 각 마켓의 로그를 독립적으로 관리 +- **로그 회전**: 10MB 파일 크기 제한, 5개 백업 파일 유지 +- **구조화된 로깅**: JSON 형태로 분석 용이성 향상 +- **성능 메트릭**: 자동 수집 및 저장 + +--- + +## 🔧 개발 가이드 + +### 새로운 마켓 크롤러 추가 + +1. `fastapi/core/crawlers/` 디렉토리에 새 크롤러 파일 생성 +2. `BaseCrawler`를 상속받아 구현 +3. `fastapi/config/parsing_rules/`에 파싱 규칙 추가 +4. 자동으로 크롤러 팩토리에 등록됨 + +### 스크립트 실행 + +```bash +# 프로젝트 재빌드 +./scripts/rebuild.sh + +# 코드베이스 정리 (이미 실행됨) +./organize_structure.sh +``` + +--- + +## 🤝 기여하기 + +1. Fork the repository +2. Create your feature branch (`git checkout -b feature/AmazingFeature`) +3. Commit your changes (`git commit -m 'Add some AmazingFeature'`) +4. Push to the branch (`git push origin feature/AmazingFeature`) +5. Open a Pull Request + +--- + +## 📄 라이선스 + +This project is licensed under the MIT License - see the [LICENSE](LICENSE) file for details. + +--- + +## ⚠️ 주의사항 + +- Chrome과 chromedriver는 호환되는 버전을 사용해야 합니다 +- 크롤링 시 해당 사이트의 robots.txt와 이용약관을 준수해야 합니다 +- 과도한 요청으로 인한 서버 부하를 방지하기 위해 적절한 딜레이를 설정하세요 diff --git a/1_infrastructure/docker/docker_fastapi/docker-compose.yml b/1_infrastructure/docker/docker_fastapi/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..2d5743dd81da329a3839659d7bfce1c2cc2a0681 --- /dev/null +++ b/1_infrastructure/docker/docker_fastapi/docker-compose.yml @@ -0,0 +1,16 @@ +version: '3' + +services: + server: + build: + context: . + dockerfile: Dockerfile + container_name: fastapi_server + network_mode: bridge + ports: + - "8000:8000" + volumes: + - ./fastapi:/fastapi + tty: true + stdin_open: true + restart: always diff --git a/1_infrastructure/docker/docker_fastapi_new/.gitignore b/1_infrastructure/docker/docker_fastapi_new/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..fbce3df0112d91b1a11ddc544b27a2e76eea233d --- /dev/null +++ b/1_infrastructure/docker/docker_fastapi_new/.gitignore @@ -0,0 +1,62 @@ +# Python +__pycache__/ +*.py[cod] +*$py.class +*.so +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +*.egg-info/ +.installed.cfg +*.egg + +# Virtual Environment +venv/ +env/ +ENV/ + +# IDE +.idea/ +.vscode/ +*.swp +*.swo + +# Docker +.docker/ + +# Logs +*.log + +# Local development +.env +.env.local +.env.*.local + +# System Files +.DS_Store +Thumbs.db + +# Project specific +*.deb +chromedriver +*.zip + +# Model files +*.h5 +*.h5.bak +*.pickle +*.pickle.bak +*.pkl +*.pt +*.onnx +*.bin \ No newline at end of file diff --git a/1_infrastructure/docker/docker_fastapi_new/Dockerfile b/1_infrastructure/docker/docker_fastapi_new/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..91b42097ed0e6ff6b9b7c95fe5cfed009d2adc4e --- /dev/null +++ b/1_infrastructure/docker/docker_fastapi_new/Dockerfile @@ -0,0 +1,71 @@ +FROM ubuntu:22.04 + +# 관련 패키지 설치 +RUN apt-get update && apt-get install -y mecab libmecab-dev mecab-ipadic-utf8 vim gcc g++ python3.10 python3-pip locales + +RUN localedef -f UTF-8 -i ko_KR ko_KR.UTF-8 +ENV LC_ALL ko_KR.UTF-8 +ENV PYTHONIOENCODING=utf-8 + +# jdk 설치 +RUN apt-get install -y openjdk-8-jdk + +# eunjeon 패키지 따로 설치 +RUN pip install eunjeon + +# jdk 설정 +RUN echo "export JAVA_HOME=/usr/lib/jvm/java-8-openjdk-amd64" >> /etc/profile && \ + echo "export CLASSPATH=.:$JAVA_HOME/jre/lib/ext:$JAVA_HOME/lib/tools.jar:$CATALINA_HOME/lib/jsp-api.jar:$CATALINA_HOME/lib/servlet-api.jar" >> /etc/profile && \ + echo "export LANG=ko_KR.UTF-8" >> /etc/profile + +WORKDIR /fastapi_new +# 이미지 내부에 필요한 파일을 복사 +COPY ./fastapi_new . + +RUN apt-get update && \ + apt-get install -y \ + wget \ + curl \ + gnupg \ + jq \ + unzip \ + libu2f-udev \ + libappindicator3-1 \ + libasound2 \ + libatk-bridge2.0-0 \ + libatk1.0-0 \ + libcups2 \ + libdbus-1-3 \ + libgtk-3-0 \ + libnspr4 \ + libnss3 \ + libx11-xcb1 \ + libxcomposite1 \ + libxcursor1 \ + libxdamage1 \ + libxfixes3 \ + libxi6 \ + libxrandr2 \ + libxss1 \ + libxtst6 \ + xdg-utils \ + fonts-liberation \ + libgbm1 \ + libvulkan1 \ + && apt-get clean + +# 크롬 자동 설치 +RUN wget -q -O - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add - +RUN echo "deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main" > /etc/apt/sources.list.d/google-chrome.list +RUN apt-get update && apt-get install -y google-chrome-stable + +# 크롬 실행 확인 +RUN google-chrome --version + +RUN mkdir -p /dev/shm && chmod 1777 /dev/shm + +RUN pip install --no-cache-dir -r requirements.txt + +#CMD +CMD ["python3","main.py"] + diff --git a/1_infrastructure/docker/docker_fastapi_new/README.md b/1_infrastructure/docker/docker_fastapi_new/README.md new file mode 100644 index 0000000000000000000000000000000000000000..086a8beee090fb9a8ccb053c5e7bcac5ddce1784 --- /dev/null +++ b/1_infrastructure/docker/docker_fastapi_new/README.md @@ -0,0 +1,71 @@ +# AI 감성 분석 및 크롤링 시스템 + +본 프로젝트는 마케팅 전략 수립 및 상품 개선을 위한 데이터 수집 및 AI 감성 분석 시스템입니다. Docker를 기반으로 패키징되어 있으며, FastAPI를 통해 API를 제공합니다. + +## 기술 아키텍처 + +시스템은 크게 데이터 수집(Crawling), 데이터 분석(Analysis), API 제공(Serving)의 3가지 핵심 기능으로 구성됩니다. + +- **`Dockerfile`**: `ubuntu:22.04`를 기반으로 하며, 애플리케이션 실행에 필요한 복잡한 환경을 구성합니다. + - **핵심 의존성**: Python 3.10, Java 8 JDK, Mecab (한국어 형태소 분석기), Google Chrome. + - Java JDK는 한국어 형태소 분석기 라이브러리인 `Eunjeon`의 의존성 해결을 위해 설치됩니다. + - Google Chrome과 관련 라이브러리(`lib*`) 및 `webdriver`는 `Selenium`을 사용한 웹 크롤링 기능을 위해 설치됩니다. +- **`docker-compose.yml`**: + - `fastapi_new_server`라는 이름의 단일 서비스를 실행합니다. + - `shm_size: 2g`: Selenium으로 Chrome을 실행할 때 발생할 수 있는 크래시를 방지하기 위해 컨테이너의 공유 메모리 크기를 2GB로 설정합니다. + - 호스트의 8001 포트를 컨테이너의 8001 포트와 매핑합니다. + +### 워크플로우 + +1. **데이터 수집 (Crawling)**: + - `api/crawling/` 디렉토리의 `smartstore.py`, `coupang.py` 모듈이 크롤링 로직을 담당합니다. + - `Selenium`, `BeautifulSoup`, `undetected-chromedriver`를 사용하여 스마트스토어, 쿠팡과 같은 이커머스 사이트에서 상품 리뷰 등의 데이터를 동적으로 수집합니다. + +2. **데이터 분석 (Analysis)**: + - **전처리**: `KoNLPy`, `Mecab`, `Eunjeon` 등의 라이브러리를 사용하여 수집된 한글 텍스트 데이터를 형태소 단위로 분석하고 정제합니다. + - **AI 분석**: `api/analysis/` 디렉토리의 `sentiment.py`(감성 분석), `associate.py`(연관 분석) 모듈이 분석 로직을 담당합니다. + - `TensorFlow`와 `Keras`로 구축된 딥러닝 모델을 사용하여 텍스트의 긍/부정 뉘앙스를 판단하는 감성 분석을 수행합니다. + +3. **API 제공 (Serving)**: + - `FastAPI`를 사용하여 분석 기능을 REST API 형태로 제공합니다. + - `app/server.py`에서 라우터를 관리하며, 인증(`auth`), 크롤링, 분석 등 기능별로 엔드포인트를 모듈화하여 관리합니다. + - `core/middleware/token_validator.py`를 통해 API 요청에 대한 토큰 기반 인증을 수행하여 허가된 사용자만 접근할 수 있도록 합니다. + +## 기술 스택 + +- **백엔드**: FastAPI, Uvicorn, Gunicorn +- **웹 크롤링**: Selenium, BeautifulSoup4, undetected-chromedriver +- **자연어 처리**: KoNLPy, Mecab, Eunjeon +- **AI/머신러닝**: TensorFlow, Keras, Scikit-learn +- **데이터베이스**: (Dockerfile 및 requirements.txt에 명시적인 DB 드라이버가 없어, 파일 기반 또는 외부 DB 연결로 추정됨) +- **오케스트레이션**: Docker, Docker Compose + +## 실행 방법 + +### 사전 요구사항 + +- Docker 및 Docker Compose + +### 설정 + +프로젝트에 필요한 환경 변수(예: DB 정보, 외부 API 키 등)는 `core/config.py` 또는 시스템 환경 변수를 통해 설정해야 합니다. (관련 설정 파일 확인 필요) + +### 실행 + +1. **Docker 이미지 빌드 및 컨테이너 실행**: + ```bash + # (선택) 기존 컨테이너 및 이미지 재빌드를 위한 스크립트 + ./rebuild.sh + + # 또는 docker-compose 직접 실행 + docker-compose up --build -d + ``` + +2. **애플리케이션 접근**: + - **API 문서 (Swagger UI)**: 컨테이너 실행 후, 브라우저에서 `http://localhost:8001/docs`로 접속하여 API 명세를 확인할 수 있습니다. + +### 중지 + +```bash +docker-compose down +``` \ No newline at end of file diff --git a/1_infrastructure/docker/docker_fastapi_new/docker-compose.yml b/1_infrastructure/docker/docker_fastapi_new/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..eee72b89d34d0c2dc1b76b43794ac4da8d56ab6c --- /dev/null +++ b/1_infrastructure/docker/docker_fastapi_new/docker-compose.yml @@ -0,0 +1,15 @@ +version: '3' + +services: + server: + build: + context: . + dockerfile: Dockerfile + container_name: fastapi_new_server + shm_size: 2g # 공유메모리 크기 설정(crome 크래시 방지) + network_mode: bridge + ports: + - "8001:8001" + tty: true + stdin_open: true + restart: always diff --git a/docker/docker_flask_proxy/Dockerfile b/1_infrastructure/docker/docker_flask_proxy/Dockerfile similarity index 100% rename from docker/docker_flask_proxy/Dockerfile rename to 1_infrastructure/docker/docker_flask_proxy/Dockerfile diff --git a/docker/docker_flask_proxy/README.md b/1_infrastructure/docker/docker_flask_proxy/README.md similarity index 100% rename from docker/docker_flask_proxy/README.md rename to 1_infrastructure/docker/docker_flask_proxy/README.md diff --git a/docker/docker_flask_proxy/app.py b/1_infrastructure/docker/docker_flask_proxy/app.py similarity index 100% rename from docker/docker_flask_proxy/app.py rename to 1_infrastructure/docker/docker_flask_proxy/app.py diff --git a/docker/docker_flask_proxy/docker-compose.yml b/1_infrastructure/docker/docker_flask_proxy/docker-compose.yml similarity index 100% rename from docker/docker_flask_proxy/docker-compose.yml rename to 1_infrastructure/docker/docker_flask_proxy/docker-compose.yml diff --git a/docker/docker_flask_proxy/proxy.geumdo.net/README b/1_infrastructure/docker/docker_flask_proxy/proxy.geumdo.net/README similarity index 100% rename from docker/docker_flask_proxy/proxy.geumdo.net/README rename to 1_infrastructure/docker/docker_flask_proxy/proxy.geumdo.net/README diff --git a/docker/docker_flask_proxy/proxy.geumdo.net/cert.pem b/1_infrastructure/docker/docker_flask_proxy/proxy.geumdo.net/cert.pem similarity index 100% rename from docker/docker_flask_proxy/proxy.geumdo.net/cert.pem rename to 1_infrastructure/docker/docker_flask_proxy/proxy.geumdo.net/cert.pem diff --git a/docker/docker_flask_proxy/proxy.geumdo.net/chain.pem b/1_infrastructure/docker/docker_flask_proxy/proxy.geumdo.net/chain.pem similarity index 100% rename from docker/docker_flask_proxy/proxy.geumdo.net/chain.pem rename to 1_infrastructure/docker/docker_flask_proxy/proxy.geumdo.net/chain.pem diff --git a/docker/docker_flask_proxy/proxy.geumdo.net/fullchain.pem b/1_infrastructure/docker/docker_flask_proxy/proxy.geumdo.net/fullchain.pem similarity index 100% rename from docker/docker_flask_proxy/proxy.geumdo.net/fullchain.pem rename to 1_infrastructure/docker/docker_flask_proxy/proxy.geumdo.net/fullchain.pem diff --git a/docker/docker_flask_proxy/proxy.geumdo.net/privkey.pem b/1_infrastructure/docker/docker_flask_proxy/proxy.geumdo.net/privkey.pem similarity index 100% rename from docker/docker_flask_proxy/proxy.geumdo.net/privkey.pem rename to 1_infrastructure/docker/docker_flask_proxy/proxy.geumdo.net/privkey.pem diff --git a/docker/docker_flask_proxy/rebuild_docker.sh b/1_infrastructure/docker/docker_flask_proxy/rebuild_docker.sh similarity index 100% rename from docker/docker_flask_proxy/rebuild_docker.sh rename to 1_infrastructure/docker/docker_flask_proxy/rebuild_docker.sh diff --git a/docker/docker_gitlab/README.md b/1_infrastructure/docker/docker_gitlab/README.md similarity index 100% rename from docker/docker_gitlab/README.md rename to 1_infrastructure/docker/docker_gitlab/README.md diff --git a/docker/docker_gitlab/docker-compose.yml b/1_infrastructure/docker/docker_gitlab/docker-compose.yml similarity index 100% rename from docker/docker_gitlab/docker-compose.yml rename to 1_infrastructure/docker/docker_gitlab/docker-compose.yml diff --git a/docker/docker_java/Dockerfile b/1_infrastructure/docker/docker_java/Dockerfile similarity index 100% rename from docker/docker_java/Dockerfile rename to 1_infrastructure/docker/docker_java/Dockerfile diff --git a/docker/docker_java/README.md b/1_infrastructure/docker/docker_java/README.md similarity index 100% rename from docker/docker_java/README.md rename to 1_infrastructure/docker/docker_java/README.md diff --git a/docker/docker_java/docker-compose.yml b/1_infrastructure/docker/docker_java/docker-compose.yml similarity index 100% rename from docker/docker_java/docker-compose.yml rename to 1_infrastructure/docker/docker_java/docker-compose.yml diff --git a/docker/docker_java/rebuild_docker.sh b/1_infrastructure/docker/docker_java/rebuild_docker.sh similarity index 100% rename from docker/docker_java/rebuild_docker.sh rename to 1_infrastructure/docker/docker_java/rebuild_docker.sh diff --git a/docker/docker_java/setting.sql b/1_infrastructure/docker/docker_java/setting.sql similarity index 100% rename from docker/docker_java/setting.sql rename to 1_infrastructure/docker/docker_java/setting.sql diff --git a/docker/docker_java/ssl/gbmax.or.kr_ssl/DigiCertCAG1.crt b/1_infrastructure/docker/docker_java/ssl/gbmax.or.kr_ssl/DigiCertCAG1.crt similarity index 100% rename from docker/docker_java/ssl/gbmax.or.kr_ssl/DigiCertCAG1.crt rename to 1_infrastructure/docker/docker_java/ssl/gbmax.or.kr_ssl/DigiCertCAG1.crt diff --git a/docker/docker_java/ssl/gbmax.or.kr_ssl/TrustedRootG2.crt b/1_infrastructure/docker/docker_java/ssl/gbmax.or.kr_ssl/TrustedRootG2.crt similarity index 100% rename from docker/docker_java/ssl/gbmax.or.kr_ssl/TrustedRootG2.crt rename to 1_infrastructure/docker/docker_java/ssl/gbmax.or.kr_ssl/TrustedRootG2.crt diff --git a/docker/docker_java/ssl/gbmax.or.kr_ssl/gbmax.or.kr.key b/1_infrastructure/docker/docker_java/ssl/gbmax.or.kr_ssl/gbmax.or.kr.key similarity index 100% rename from docker/docker_java/ssl/gbmax.or.kr_ssl/gbmax.or.kr.key rename to 1_infrastructure/docker/docker_java/ssl/gbmax.or.kr_ssl/gbmax.or.kr.key diff --git a/docker/docker_java/ssl/gbmax.or.kr_ssl/gbmax.or.kr.p7b b/1_infrastructure/docker/docker_java/ssl/gbmax.or.kr_ssl/gbmax.or.kr.p7b similarity index 100% rename from docker/docker_java/ssl/gbmax.or.kr_ssl/gbmax.or.kr.p7b rename to 1_infrastructure/docker/docker_java/ssl/gbmax.or.kr_ssl/gbmax.or.kr.p7b diff --git a/docker/docker_java/ssl/max.or.kr_ssl/DigiCertCAG1.crt b/1_infrastructure/docker/docker_java/ssl/max.or.kr_ssl/DigiCertCAG1.crt similarity index 100% rename from docker/docker_java/ssl/max.or.kr_ssl/DigiCertCAG1.crt rename to 1_infrastructure/docker/docker_java/ssl/max.or.kr_ssl/DigiCertCAG1.crt diff --git a/docker/docker_java/ssl/max.or.kr_ssl/TrustedRootG2.crt b/1_infrastructure/docker/docker_java/ssl/max.or.kr_ssl/TrustedRootG2.crt similarity index 100% rename from docker/docker_java/ssl/max.or.kr_ssl/TrustedRootG2.crt rename to 1_infrastructure/docker/docker_java/ssl/max.or.kr_ssl/TrustedRootG2.crt diff --git a/docker/docker_java/ssl/max.or.kr_ssl/max.or.kr.key b/1_infrastructure/docker/docker_java/ssl/max.or.kr_ssl/max.or.kr.key similarity index 100% rename from docker/docker_java/ssl/max.or.kr_ssl/max.or.kr.key rename to 1_infrastructure/docker/docker_java/ssl/max.or.kr_ssl/max.or.kr.key diff --git a/docker/docker_java/ssl/max.or.kr_ssl/max.or.kr.p7b b/1_infrastructure/docker/docker_java/ssl/max.or.kr_ssl/max.or.kr.p7b similarity index 100% rename from docker/docker_java/ssl/max.or.kr_ssl/max.or.kr.p7b rename to 1_infrastructure/docker/docker_java/ssl/max.or.kr_ssl/max.or.kr.p7b diff --git a/docker/docker_java/start_service.sh b/1_infrastructure/docker/docker_java/start_service.sh similarity index 100% rename from docker/docker_java/start_service.sh rename to 1_infrastructure/docker/docker_java/start_service.sh diff --git a/docker/docker_jenkins/Dockerfile b/1_infrastructure/docker/docker_jenkins/Dockerfile similarity index 100% rename from docker/docker_jenkins/Dockerfile rename to 1_infrastructure/docker/docker_jenkins/Dockerfile diff --git a/docker/docker_jenkins/README.md b/1_infrastructure/docker/docker_jenkins/README.md similarity index 100% rename from docker/docker_jenkins/README.md rename to 1_infrastructure/docker/docker_jenkins/README.md diff --git a/docker/docker_jenkins/docker-compose.yml b/1_infrastructure/docker/docker_jenkins/docker-compose.yml similarity index 100% rename from docker/docker_jenkins/docker-compose.yml rename to 1_infrastructure/docker/docker_jenkins/docker-compose.yml diff --git a/docker/docker_jenkins/rebuild.sh b/1_infrastructure/docker/docker_jenkins/rebuild.sh similarity index 100% rename from docker/docker_jenkins/rebuild.sh rename to 1_infrastructure/docker/docker_jenkins/rebuild.sh diff --git a/docker/docker_jenkins/start_service.sh b/1_infrastructure/docker/docker_jenkins/start_service.sh similarity index 100% rename from docker/docker_jenkins/start_service.sh rename to 1_infrastructure/docker/docker_jenkins/start_service.sh diff --git a/docker/docker_jupyter/Dockerfile b/1_infrastructure/docker/docker_jupyter/Dockerfile similarity index 100% rename from docker/docker_jupyter/Dockerfile rename to 1_infrastructure/docker/docker_jupyter/Dockerfile diff --git a/docker/docker_jupyter/README.md b/1_infrastructure/docker/docker_jupyter/README.md similarity index 100% rename from docker/docker_jupyter/README.md rename to 1_infrastructure/docker/docker_jupyter/README.md diff --git a/docker/docker_jupyter/docker-compose.yml b/1_infrastructure/docker/docker_jupyter/docker-compose.yml similarity index 100% rename from docker/docker_jupyter/docker-compose.yml rename to 1_infrastructure/docker/docker_jupyter/docker-compose.yml diff --git a/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled 1.ipynb b/1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled 1.ipynb similarity index 100% rename from docker/docker_jupyter/notebooks/.Trash-0/files/Untitled 1.ipynb rename to 1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled 1.ipynb diff --git a/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled.ipynb b/1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled.ipynb similarity index 100% rename from docker/docker_jupyter/notebooks/.Trash-0/files/Untitled.ipynb rename to 1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled.ipynb diff --git a/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled1.ipynb b/1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled1.ipynb similarity index 100% rename from docker/docker_jupyter/notebooks/.Trash-0/files/Untitled1.ipynb rename to 1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled1.ipynb diff --git a/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled2.ipynb b/1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled2.ipynb similarity index 100% rename from docker/docker_jupyter/notebooks/.Trash-0/files/Untitled2.ipynb rename to 1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/files/Untitled2.ipynb diff --git a/docker/docker_jupyter/notebooks/.Trash-0/files/llama3.1_koalpaca.ipynb b/1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/files/llama3.1_koalpaca.ipynb similarity index 100% rename from docker/docker_jupyter/notebooks/.Trash-0/files/llama3.1_koalpaca.ipynb rename to 1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/files/llama3.1_koalpaca.ipynb diff --git a/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled 1.ipynb.trashinfo b/1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled 1.ipynb.trashinfo similarity index 100% rename from docker/docker_jupyter/notebooks/.Trash-0/info/Untitled 1.ipynb.trashinfo rename to 1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled 1.ipynb.trashinfo diff --git a/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled Folder.trashinfo b/1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled Folder.trashinfo similarity index 100% rename from docker/docker_jupyter/notebooks/.Trash-0/info/Untitled Folder.trashinfo rename to 1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled Folder.trashinfo diff --git a/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled.ipynb.trashinfo b/1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled.ipynb.trashinfo similarity index 100% rename from docker/docker_jupyter/notebooks/.Trash-0/info/Untitled.ipynb.trashinfo rename to 1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled.ipynb.trashinfo diff --git a/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled1.ipynb.trashinfo b/1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled1.ipynb.trashinfo similarity index 100% rename from docker/docker_jupyter/notebooks/.Trash-0/info/Untitled1.ipynb.trashinfo rename to 1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled1.ipynb.trashinfo diff --git a/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled2.ipynb.trashinfo b/1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled2.ipynb.trashinfo similarity index 100% rename from docker/docker_jupyter/notebooks/.Trash-0/info/Untitled2.ipynb.trashinfo rename to 1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/Untitled2.ipynb.trashinfo diff --git a/docker/docker_jupyter/notebooks/.Trash-0/info/llama3.1_koalpaca.ipynb.trashinfo b/1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/llama3.1_koalpaca.ipynb.trashinfo similarity index 100% rename from docker/docker_jupyter/notebooks/.Trash-0/info/llama3.1_koalpaca.ipynb.trashinfo rename to 1_infrastructure/docker/docker_jupyter/notebooks/.Trash-0/info/llama3.1_koalpaca.ipynb.trashinfo diff --git a/docker/docker_jupyter/notebooks/Untitled.ipynb b/1_infrastructure/docker/docker_jupyter/notebooks/Untitled.ipynb similarity index 100% rename from docker/docker_jupyter/notebooks/Untitled.ipynb rename to 1_infrastructure/docker/docker_jupyter/notebooks/Untitled.ipynb diff --git a/docker/docker_jupyter/notebooks/bi-lstm-1.ipynb b/1_infrastructure/docker/docker_jupyter/notebooks/bi-lstm-1.ipynb similarity index 100% rename from docker/docker_jupyter/notebooks/bi-lstm-1.ipynb rename to 1_infrastructure/docker/docker_jupyter/notebooks/bi-lstm-1.ipynb diff --git a/docker/docker_jupyter/notebooks/gpucheck.ipynb b/1_infrastructure/docker/docker_jupyter/notebooks/gpucheck.ipynb similarity index 100% rename from docker/docker_jupyter/notebooks/gpucheck.ipynb rename to 1_infrastructure/docker/docker_jupyter/notebooks/gpucheck.ipynb diff --git a/docker/docker_jupyter/notebooks/test.txt b/1_infrastructure/docker/docker_jupyter/notebooks/test.txt similarity index 100% rename from docker/docker_jupyter/notebooks/test.txt rename to 1_infrastructure/docker/docker_jupyter/notebooks/test.txt diff --git a/docker/docker_jupyter/rebuild.sh b/1_infrastructure/docker/docker_jupyter/rebuild.sh similarity index 100% rename from docker/docker_jupyter/rebuild.sh rename to 1_infrastructure/docker/docker_jupyter/rebuild.sh diff --git a/docker/docker_jupyter/requirements.txt b/1_infrastructure/docker/docker_jupyter/requirements.txt similarity index 100% rename from docker/docker_jupyter/requirements.txt rename to 1_infrastructure/docker/docker_jupyter/requirements.txt diff --git a/docker/docker_jupyter/start_service.sh b/1_infrastructure/docker/docker_jupyter/start_service.sh similarity index 100% rename from docker/docker_jupyter/start_service.sh rename to 1_infrastructure/docker/docker_jupyter/start_service.sh diff --git a/docker/docker_mailserver/README.md b/1_infrastructure/docker/docker_mailserver/README.md similarity index 100% rename from docker/docker_mailserver/README.md rename to 1_infrastructure/docker/docker_mailserver/README.md diff --git a/docker/docker_mailserver/certs/ca.crt b/1_infrastructure/docker/docker_mailserver/certs/ca.crt similarity index 100% rename from docker/docker_mailserver/certs/ca.crt rename to 1_infrastructure/docker/docker_mailserver/certs/ca.crt diff --git a/docker/docker_mailserver/certs/dh4096.pem b/1_infrastructure/docker/docker_mailserver/certs/dh4096.pem similarity index 100% rename from docker/docker_mailserver/certs/dh4096.pem rename to 1_infrastructure/docker/docker_mailserver/certs/dh4096.pem diff --git a/docker/docker_mailserver/certs/letsencrypt/README b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/README similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/README rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/README diff --git a/docker/docker_mailserver/certs/letsencrypt/_account/private.pem b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/_account/private.pem similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/_account/private.pem rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/_account/private.pem diff --git a/docker/docker_mailserver/certs/letsencrypt/_account/public.pem b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/_account/public.pem similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/_account/public.pem rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/_account/public.pem diff --git a/docker/docker_mailserver/certs/letsencrypt/cert.pem b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/cert.pem similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/cert.pem rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/cert.pem diff --git a/docker/docker_mailserver/certs/letsencrypt/chain.pem b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/chain.pem similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/chain.pem rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/chain.pem diff --git a/docker/docker_mailserver/certs/letsencrypt/fullchain.pem b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/fullchain.pem similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/fullchain.pem rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/fullchain.pem diff --git a/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/cert.pem b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/cert.pem similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/cert.pem rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/cert.pem diff --git a/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/chain.pem b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/chain.pem similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/chain.pem rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/chain.pem diff --git a/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/fullchain.pem b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/fullchain.pem similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/fullchain.pem rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/fullchain.pem diff --git a/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/last.csr b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/last.csr similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/last.csr rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/last.csr diff --git a/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/private.pem b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/private.pem similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/private.pem rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/private.pem diff --git a/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/public.pem b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/public.pem similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/public.pem rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/mail.geumdo.net/public.pem diff --git a/docker/docker_mailserver/certs/letsencrypt/privkey.pem b/1_infrastructure/docker/docker_mailserver/certs/letsencrypt/privkey.pem similarity index 100% rename from docker/docker_mailserver/certs/letsencrypt/privkey.pem rename to 1_infrastructure/docker/docker_mailserver/certs/letsencrypt/privkey.pem diff --git a/docker/docker_mailserver/certs/server.crt b/1_infrastructure/docker/docker_mailserver/certs/server.crt similarity index 100% rename from docker/docker_mailserver/certs/server.crt rename to 1_infrastructure/docker/docker_mailserver/certs/server.crt diff --git a/docker/docker_mailserver/certs/server.key b/1_infrastructure/docker/docker_mailserver/certs/server.key similarity index 100% rename from docker/docker_mailserver/certs/server.key rename to 1_infrastructure/docker/docker_mailserver/certs/server.key diff --git a/docker/docker_mailserver/docker-compose.yml b/1_infrastructure/docker/docker_mailserver/docker-compose.yml similarity index 100% rename from docker/docker_mailserver/docker-compose.yml rename to 1_infrastructure/docker/docker_mailserver/docker-compose.yml diff --git a/docker/docker_mailserver/rebuild.sh b/1_infrastructure/docker/docker_mailserver/rebuild.sh similarity index 100% rename from docker/docker_mailserver/rebuild.sh rename to 1_infrastructure/docker/docker_mailserver/rebuild.sh diff --git a/docker/docker_metaverse/Dockerfile b/1_infrastructure/docker/docker_metaverse/Dockerfile similarity index 100% rename from docker/docker_metaverse/Dockerfile rename to 1_infrastructure/docker/docker_metaverse/Dockerfile diff --git a/docker/docker_metaverse/README.md b/1_infrastructure/docker/docker_metaverse/README.md similarity index 100% rename from docker/docker_metaverse/README.md rename to 1_infrastructure/docker/docker_metaverse/README.md diff --git a/docker/docker_metaverse/docker-compose.yml b/1_infrastructure/docker/docker_metaverse/docker-compose.yml similarity index 100% rename from docker/docker_metaverse/docker-compose.yml rename to 1_infrastructure/docker/docker_metaverse/docker-compose.yml diff --git a/docker/docker_metaverse/etc/nginx/sites-available/default b/1_infrastructure/docker/docker_metaverse/etc/nginx/sites-available/default similarity index 100% rename from docker/docker_metaverse/etc/nginx/sites-available/default rename to 1_infrastructure/docker/docker_metaverse/etc/nginx/sites-available/default diff --git a/docker/docker_metaverse/home/ubuntu/node/index.js b/1_infrastructure/docker/docker_metaverse/home/ubuntu/node/index.js similarity index 100% rename from docker/docker_metaverse/home/ubuntu/node/index.js rename to 1_infrastructure/docker/docker_metaverse/home/ubuntu/node/index.js diff --git a/docker/docker_metaverse/home/ubuntu/node/m_fword.js b/1_infrastructure/docker/docker_metaverse/home/ubuntu/node/m_fword.js similarity index 100% rename from docker/docker_metaverse/home/ubuntu/node/m_fword.js rename to 1_infrastructure/docker/docker_metaverse/home/ubuntu/node/m_fword.js diff --git a/docker/docker_metaverse/home/ubuntu/node/socket.js b/1_infrastructure/docker/docker_metaverse/home/ubuntu/node/socket.js similarity index 100% rename from docker/docker_metaverse/home/ubuntu/node/socket.js rename to 1_infrastructure/docker/docker_metaverse/home/ubuntu/node/socket.js diff --git a/docker/docker_metaverse/home/ubuntu/node/test_chat.html b/1_infrastructure/docker/docker_metaverse/home/ubuntu/node/test_chat.html similarity index 100% rename from docker/docker_metaverse/home/ubuntu/node/test_chat.html rename to 1_infrastructure/docker/docker_metaverse/home/ubuntu/node/test_chat.html diff --git a/docker/docker_metaverse/home/ubuntu/node/test_socket_chat.html b/1_infrastructure/docker/docker_metaverse/home/ubuntu/node/test_socket_chat.html similarity index 100% rename from docker/docker_metaverse/home/ubuntu/node/test_socket_chat.html rename to 1_infrastructure/docker/docker_metaverse/home/ubuntu/node/test_socket_chat.html diff --git a/docker/docker_metaverse/home/ubuntu/node/test_upload.html b/1_infrastructure/docker/docker_metaverse/home/ubuntu/node/test_upload.html similarity index 100% rename from docker/docker_metaverse/home/ubuntu/node/test_upload.html rename to 1_infrastructure/docker/docker_metaverse/home/ubuntu/node/test_upload.html diff --git a/docker/docker_metaverse/nodam.sql b/1_infrastructure/docker/docker_metaverse/nodam.sql similarity index 100% rename from docker/docker_metaverse/nodam.sql rename to 1_infrastructure/docker/docker_metaverse/nodam.sql diff --git a/docker/docker_metaverse/readme.txt b/1_infrastructure/docker/docker_metaverse/readme.txt similarity index 100% rename from docker/docker_metaverse/readme.txt rename to 1_infrastructure/docker/docker_metaverse/readme.txt diff --git a/docker/docker_metaverse/rebuild_docker.sh b/1_infrastructure/docker/docker_metaverse/rebuild_docker.sh similarity index 100% rename from docker/docker_metaverse/rebuild_docker.sh rename to 1_infrastructure/docker/docker_metaverse/rebuild_docker.sh diff --git a/docker/docker_metaverse/start_service.sh b/1_infrastructure/docker/docker_metaverse/start_service.sh similarity index 100% rename from docker/docker_metaverse/start_service.sh rename to 1_infrastructure/docker/docker_metaverse/start_service.sh diff --git a/docker/docker_nginx_proxy/Dockerfile b/1_infrastructure/docker/docker_nginx_proxy/Dockerfile similarity index 100% rename from docker/docker_nginx_proxy/Dockerfile rename to 1_infrastructure/docker/docker_nginx_proxy/Dockerfile diff --git a/docker/docker_nginx_proxy/README.md b/1_infrastructure/docker/docker_nginx_proxy/README.md similarity index 100% rename from docker/docker_nginx_proxy/README.md rename to 1_infrastructure/docker/docker_nginx_proxy/README.md diff --git a/docker/docker_nginx_proxy/docker-compose.yml b/1_infrastructure/docker/docker_nginx_proxy/docker-compose.yml similarity index 100% rename from docker/docker_nginx_proxy/docker-compose.yml rename to 1_infrastructure/docker/docker_nginx_proxy/docker-compose.yml diff --git a/docker/docker_nginx_proxy/letsencrypt/.updated-options-ssl-nginx-conf-digest.txt b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/.updated-options-ssl-nginx-conf-digest.txt similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/.updated-options-ssl-nginx-conf-digest.txt rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/.updated-options-ssl-nginx-conf-digest.txt diff --git a/docker/docker_nginx_proxy/letsencrypt/.updated-ssl-dhparams-pem-digest.txt b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/.updated-ssl-dhparams-pem-digest.txt similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/.updated-ssl-dhparams-pem-digest.txt rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/.updated-ssl-dhparams-pem-digest.txt diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert2.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert2.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert2.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert2.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert3.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert3.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert3.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/cert3.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain2.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain2.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain2.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain2.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain3.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain3.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain3.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/chain3.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain2.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain2.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain2.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain2.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain3.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain3.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain3.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/fullchain3.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey2.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey2.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey2.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey2.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey3.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey3.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey3.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/dip-zero.geumdo.net/privkey3.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert2.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert2.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert2.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert2.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert3.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert3.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert3.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/cert3.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain2.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain2.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain2.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain2.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain3.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain3.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain3.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/chain3.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain2.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain2.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain2.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain2.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain3.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain3.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain3.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/fullchain3.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey2.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey2.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey2.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey2.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey3.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey3.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey3.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/mail.geumdo.net/privkey3.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/cert1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/cert1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/cert1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/cert1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/chain1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/chain1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/chain1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/chain1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/fullchain1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/fullchain1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/fullchain1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/fullchain1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/privkey1.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/privkey1.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/privkey1.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/archive/proxy.geumdo.net/privkey1.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/cli.ini b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/cli.ini similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/cli.ini rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/cli.ini diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0000_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0000_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0000_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0000_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0001_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0001_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0001_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0001_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0002_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0002_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0002_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0002_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0003_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0003_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0003_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0003_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0004_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0004_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0004_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0004_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0005_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0005_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0005_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0005_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0006_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0006_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0006_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0006_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0007_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0007_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0007_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0007_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0008_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0008_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0008_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0008_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0009_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0009_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0009_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0009_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0010_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0010_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0010_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0010_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0011_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0011_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0011_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0011_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0012_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0012_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0012_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0012_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0013_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0013_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0013_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0013_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0014_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0014_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0014_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0014_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0015_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0015_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0015_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0015_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0016_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0016_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0016_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0016_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0017_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0017_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0017_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0017_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0018_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0018_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0018_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0018_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0019_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0019_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0019_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0019_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0020_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0020_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0020_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0020_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0021_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0021_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0021_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0021_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0022_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0022_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0022_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0022_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0023_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0023_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0023_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0023_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0024_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0024_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0024_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0024_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0025_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0025_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0025_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0025_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0026_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0026_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0026_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0026_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0027_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0027_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0027_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0027_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0028_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0028_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0028_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0028_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0029_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0029_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0029_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0029_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0030_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0030_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0030_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0030_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0031_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0031_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0031_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0031_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0032_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0032_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0032_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0032_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0033_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0033_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0033_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0033_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0034_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0034_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0034_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0034_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0035_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0035_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0035_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0035_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0036_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0036_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0036_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0036_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0037_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0037_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0037_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0037_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0038_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0038_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0038_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0038_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0039_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0039_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0039_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0039_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0040_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0040_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0040_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0040_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0041_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0041_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0041_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0041_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0042_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0042_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0042_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0042_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0043_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0043_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0043_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0043_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0044_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0044_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0044_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0044_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0045_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0045_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0045_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0045_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0046_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0046_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0046_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0046_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0047_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0047_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0047_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0047_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0048_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0048_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0048_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0048_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0049_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0049_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0049_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0049_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0050_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0050_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0050_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0050_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0051_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0051_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0051_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0051_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0052_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0052_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0052_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0052_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0053_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0053_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0053_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0053_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0054_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0054_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0054_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0054_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0055_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0055_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0055_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0055_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0056_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0056_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0056_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0056_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0057_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0057_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0057_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0057_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0058_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0058_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0058_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0058_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0059_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0059_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0059_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0059_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0060_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0060_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0060_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0060_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0061_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0061_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0061_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0061_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0062_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0062_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0062_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0062_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0063_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0063_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0063_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0063_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0064_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0064_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0064_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0064_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0065_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0065_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0065_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0065_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0066_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0066_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0066_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0066_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0067_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0067_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0067_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0067_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0068_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0068_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0068_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0068_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0069_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0069_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0069_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0069_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0070_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0070_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0070_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0070_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0071_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0071_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0071_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0071_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0072_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0072_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0072_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0072_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0073_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0073_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0073_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0073_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0074_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0074_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0074_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0074_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0075_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0075_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0075_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0075_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0076_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0076_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0076_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0076_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0077_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0077_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0077_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0077_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0078_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0078_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0078_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0078_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0079_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0079_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0079_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0079_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0080_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0080_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0080_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0080_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0081_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0081_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0081_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0081_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0082_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0082_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0082_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0082_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0083_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0083_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0083_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0083_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0084_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0084_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0084_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0084_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0085_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0085_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0085_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0085_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0086_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0086_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0086_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0086_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0087_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0087_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0087_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0087_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0088_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0088_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0088_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0088_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0089_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0089_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0089_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0089_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0090_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0090_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0090_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0090_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0091_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0091_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0091_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0091_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0092_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0092_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0092_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0092_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0093_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0093_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0093_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0093_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0094_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0094_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0094_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0094_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0095_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0095_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0095_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0095_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0096_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0096_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0096_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0096_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0097_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0097_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0097_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0097_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0098_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0098_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0098_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0098_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0099_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0099_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0099_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0099_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0100_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0100_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0100_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0100_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0101_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0101_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0101_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0101_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0102_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0102_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0102_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0102_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0103_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0103_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0103_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0103_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0104_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0104_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0104_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0104_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0105_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0105_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0105_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0105_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0106_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0106_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0106_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0106_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0107_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0107_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0107_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0107_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0108_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0108_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0108_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0108_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0109_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0109_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0109_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0109_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0110_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0110_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0110_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0110_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0111_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0111_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0111_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0111_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0112_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0112_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0112_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0112_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0113_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0113_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0113_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0113_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0114_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0114_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0114_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0114_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0115_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0115_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0115_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0115_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0116_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0116_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0116_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0116_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0117_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0117_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0117_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0117_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0118_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0118_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0118_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0118_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0119_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0119_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0119_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0119_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0120_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0120_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0120_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0120_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0121_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0121_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0121_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0121_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0122_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0122_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0122_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0122_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0123_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0123_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0123_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0123_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0124_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0124_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0124_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0124_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0125_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0125_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0125_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0125_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0126_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0126_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0126_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0126_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0127_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0127_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0127_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0127_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0128_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0128_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0128_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0128_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0129_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0129_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0129_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0129_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0130_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0130_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0130_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0130_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0131_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0131_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0131_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0131_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0132_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0132_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0132_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0132_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0133_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0133_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0133_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0133_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0134_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0134_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0134_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0134_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0135_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0135_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0135_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0135_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0136_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0136_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0136_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0136_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0137_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0137_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0137_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0137_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0138_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0138_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0138_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0138_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0139_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0139_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0139_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0139_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0140_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0140_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0140_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0140_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0141_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0141_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0141_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0141_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0142_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0142_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0142_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0142_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0143_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0143_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0143_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0143_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0144_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0144_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0144_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0144_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0145_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0145_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0145_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0145_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0146_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0146_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0146_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0146_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0147_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0147_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0147_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0147_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0148_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0148_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0148_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0148_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0149_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0149_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0149_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0149_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0150_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0150_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0150_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0150_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0151_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0151_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0151_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0151_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0152_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0152_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0152_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0152_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0153_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0153_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0153_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0153_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0154_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0154_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0154_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0154_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0155_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0155_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0155_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0155_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0156_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0156_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0156_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0156_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0157_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0157_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0157_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0157_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0158_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0158_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0158_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0158_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0159_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0159_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0159_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0159_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0160_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0160_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0160_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0160_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0161_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0161_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0161_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0161_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0162_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0162_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0162_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0162_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0163_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0163_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0163_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0163_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0164_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0164_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0164_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0164_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0165_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0165_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0165_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0165_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0166_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0166_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0166_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0166_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0167_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0167_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0167_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0167_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0168_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0168_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0168_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0168_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0169_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0169_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0169_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0169_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0170_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0170_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0170_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0170_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0171_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0171_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0171_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0171_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0172_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0172_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0172_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0172_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0173_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0173_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0173_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0173_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0174_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0174_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0174_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0174_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0175_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0175_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0175_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0175_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0176_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0176_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0176_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0176_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0177_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0177_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0177_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0177_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0178_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0178_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0178_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0178_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0179_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0179_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0179_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0179_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0180_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0180_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0180_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0180_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0181_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0181_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0181_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0181_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0182_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0182_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0182_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0182_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0183_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0183_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0183_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0183_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0184_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0184_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0184_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0184_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0185_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0185_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0185_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0185_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0186_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0186_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0186_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0186_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0187_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0187_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0187_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0187_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0188_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0188_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0188_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0188_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0189_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0189_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0189_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0189_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0190_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0190_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0190_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0190_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0191_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0191_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0191_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0191_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0192_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0192_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0192_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0192_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0193_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0193_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0193_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0193_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0194_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0194_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0194_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0194_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0195_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0195_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0195_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0195_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0196_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0196_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0196_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0196_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0197_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0197_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0197_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0197_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0198_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0198_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0198_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0198_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0199_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0199_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0199_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0199_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0200_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0200_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0200_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0200_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0201_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0201_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0201_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0201_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0202_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0202_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0202_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0202_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0203_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0203_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0203_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0203_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0204_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0204_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0204_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0204_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0205_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0205_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0205_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0205_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0206_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0206_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0206_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0206_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0207_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0207_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0207_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0207_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0208_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0208_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0208_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0208_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0209_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0209_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0209_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0209_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0210_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0210_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0210_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0210_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0211_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0211_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0211_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0211_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0212_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0212_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0212_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0212_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0213_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0213_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0213_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0213_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0214_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0214_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0214_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0214_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0215_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0215_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0215_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0215_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0216_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0216_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0216_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0216_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0217_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0217_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0217_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0217_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0218_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0218_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0218_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0218_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0219_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0219_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0219_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0219_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0220_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0220_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0220_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0220_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0221_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0221_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0221_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0221_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0222_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0222_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0222_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0222_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0223_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0223_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0223_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0223_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0224_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0224_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0224_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0224_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0225_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0225_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0225_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0225_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0226_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0226_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0226_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0226_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0227_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0227_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0227_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0227_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0228_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0228_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0228_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0228_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0229_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0229_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0229_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0229_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0230_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0230_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0230_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0230_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0231_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0231_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0231_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0231_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0232_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0232_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0232_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0232_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0233_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0233_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0233_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0233_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0234_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0234_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0234_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0234_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0235_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0235_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0235_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0235_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0236_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0236_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0236_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0236_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0237_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0237_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0237_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0237_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0238_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0238_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0238_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0238_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0239_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0239_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0239_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0239_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0240_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0240_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0240_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0240_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0241_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0241_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0241_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0241_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0242_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0242_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0242_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0242_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0243_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0243_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0243_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0243_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0244_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0244_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0244_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0244_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0245_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0245_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0245_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0245_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0246_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0246_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0246_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0246_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0247_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0247_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0247_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0247_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0248_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0248_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0248_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0248_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0249_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0249_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0249_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0249_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0250_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0250_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0250_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0250_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0251_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0251_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0251_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0251_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0252_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0252_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0252_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0252_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0253_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0253_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0253_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0253_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0254_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0254_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0254_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0254_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0255_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0255_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0255_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0255_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0256_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0256_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0256_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0256_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0257_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0257_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0257_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0257_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0258_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0258_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0258_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0258_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0259_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0259_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0259_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0259_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0260_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0260_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0260_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0260_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0261_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0261_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0261_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0261_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0262_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0262_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0262_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0262_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0263_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0263_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0263_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0263_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0264_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0264_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0264_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0264_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0265_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0265_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0265_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0265_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0266_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0266_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0266_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0266_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0267_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0267_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0267_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0267_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0268_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0268_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0268_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0268_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0269_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0269_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0269_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0269_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0270_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0270_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0270_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0270_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0271_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0271_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0271_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0271_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0272_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0272_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0272_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0272_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0273_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0273_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0273_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0273_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0274_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0274_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0274_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0274_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0275_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0275_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0275_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0275_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0276_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0276_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0276_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0276_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0277_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0277_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0277_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0277_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0278_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0278_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0278_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0278_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0279_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0279_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0279_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0279_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0280_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0280_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0280_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0280_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0281_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0281_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0281_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0281_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0282_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0282_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0282_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0282_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0283_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0283_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0283_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0283_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0284_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0284_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0284_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0284_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0285_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0285_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0285_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0285_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0286_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0286_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0286_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0286_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0287_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0287_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0287_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0287_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0288_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0288_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0288_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0288_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0289_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0289_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0289_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0289_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0290_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0290_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0290_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0290_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0291_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0291_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0291_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0291_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0292_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0292_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0292_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0292_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0293_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0293_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0293_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0293_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0294_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0294_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0294_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0294_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0295_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0295_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0295_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0295_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0296_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0296_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0296_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0296_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0297_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0297_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0297_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0297_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0298_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0298_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0298_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0298_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0299_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0299_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0299_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0299_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0300_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0300_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0300_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0300_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0301_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0301_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0301_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0301_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0302_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0302_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0302_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0302_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0303_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0303_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0303_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0303_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0304_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0304_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0304_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0304_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0305_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0305_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0305_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0305_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0306_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0306_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0306_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0306_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0307_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0307_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0307_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0307_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0308_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0308_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0308_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0308_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0309_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0309_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0309_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0309_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0310_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0310_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0310_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0310_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0311_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0311_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0311_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0311_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0312_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0312_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0312_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0312_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0313_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0313_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0313_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0313_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0314_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0314_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0314_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0314_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0315_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0315_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0315_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0315_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0316_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0316_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0316_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0316_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0317_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0317_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0317_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0317_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0318_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0318_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0318_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0318_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0319_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0319_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0319_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0319_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0320_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0320_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0320_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0320_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0321_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0321_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0321_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0321_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0322_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0322_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0322_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0322_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0323_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0323_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0323_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0323_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0324_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0324_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0324_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0324_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0325_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0325_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0325_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0325_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0326_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0326_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0326_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0326_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0327_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0327_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0327_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0327_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0328_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0328_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0328_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0328_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0329_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0329_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0329_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0329_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0330_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0330_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0330_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0330_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0331_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0331_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0331_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0331_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0332_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0332_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0332_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0332_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0333_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0333_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0333_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0333_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0334_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0334_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0334_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0334_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0335_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0335_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0335_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0335_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0336_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0336_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0336_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0336_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0337_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0337_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0337_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0337_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0338_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0338_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0338_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0338_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0339_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0339_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0339_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0339_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0340_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0340_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0340_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0340_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0341_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0341_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0341_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0341_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0342_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0342_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0342_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0342_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0343_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0343_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0343_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0343_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0344_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0344_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0344_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0344_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0345_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0345_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0345_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0345_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0346_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0346_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0346_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0346_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0347_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0347_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0347_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0347_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0348_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0348_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0348_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0348_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0349_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0349_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0349_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0349_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0350_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0350_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0350_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0350_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0351_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0351_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0351_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0351_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0352_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0352_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0352_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0352_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0353_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0353_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0353_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0353_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0354_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0354_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0354_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0354_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0355_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0355_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0355_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0355_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0356_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0356_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0356_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0356_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0357_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0357_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0357_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0357_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0358_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0358_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0358_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0358_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0359_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0359_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0359_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0359_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0360_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0360_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0360_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0360_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0361_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0361_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0361_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0361_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0362_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0362_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0362_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0362_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0363_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0363_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0363_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0363_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0364_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0364_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0364_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0364_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0365_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0365_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0365_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0365_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0366_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0366_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0366_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0366_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0367_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0367_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0367_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0367_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0368_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0368_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0368_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0368_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0369_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0369_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0369_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0369_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0370_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0370_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0370_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0370_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0371_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0371_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0371_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0371_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0372_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0372_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0372_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0372_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0373_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0373_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0373_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0373_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0374_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0374_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0374_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0374_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0375_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0375_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0375_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0375_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0376_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0376_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0376_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0376_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0377_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0377_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0377_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0377_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0378_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0378_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0378_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0378_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0379_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0379_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0379_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0379_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0380_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0380_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0380_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0380_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0381_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0381_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0381_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0381_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0382_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0382_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0382_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0382_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0383_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0383_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0383_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0383_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0384_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0384_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0384_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0384_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0385_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0385_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0385_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0385_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0386_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0386_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0386_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0386_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0387_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0387_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0387_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0387_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0388_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0388_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0388_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0388_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0389_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0389_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0389_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0389_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0390_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0390_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0390_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0390_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0391_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0391_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0391_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0391_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0392_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0392_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0392_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0392_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0393_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0393_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0393_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0393_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0394_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0394_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0394_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0394_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0395_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0395_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0395_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0395_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0396_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0396_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0396_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0396_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0397_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0397_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0397_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0397_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0398_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0398_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0398_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0398_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0399_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0399_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0399_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0399_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0400_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0400_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0400_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0400_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0401_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0401_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0401_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0401_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0402_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0402_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0402_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0402_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0403_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0403_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0403_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0403_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0404_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0404_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0404_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0404_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0405_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0405_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0405_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0405_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0406_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0406_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0406_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0406_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0407_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0407_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0407_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0407_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0408_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0408_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0408_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0408_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0409_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0409_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0409_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0409_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0410_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0410_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0410_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0410_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0411_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0411_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0411_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0411_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0412_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0412_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0412_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0412_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0413_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0413_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0413_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0413_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0414_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0414_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0414_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0414_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0415_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0415_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0415_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0415_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0416_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0416_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0416_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0416_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0417_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0417_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0417_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0417_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0418_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0418_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0418_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0418_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0419_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0419_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0419_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0419_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0420_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0420_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0420_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0420_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0421_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0421_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0421_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0421_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0422_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0422_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0422_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0422_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0423_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0423_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0423_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0423_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0424_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0424_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0424_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0424_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0425_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0425_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0425_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0425_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0426_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0426_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0426_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0426_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0427_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0427_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0427_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0427_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0428_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0428_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0428_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0428_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0429_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0429_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0429_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0429_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0430_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0430_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0430_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0430_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0431_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0431_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0431_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0431_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0432_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0432_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0432_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0432_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0433_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0433_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0433_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0433_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0434_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0434_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0434_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0434_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0435_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0435_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0435_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0435_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0436_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0436_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0436_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0436_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0437_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0437_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0437_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0437_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0438_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0438_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0438_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0438_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0439_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0439_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0439_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0439_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0440_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0440_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0440_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0440_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0441_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0441_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0441_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0441_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0442_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0442_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0442_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0442_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0443_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0443_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0443_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0443_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0444_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0444_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0444_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0444_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0445_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0445_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0445_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0445_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0446_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0446_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0446_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0446_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0447_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0447_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0447_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0447_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0448_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0448_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0448_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0448_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0449_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0449_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0449_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0449_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0450_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0450_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0450_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0450_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0451_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0451_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0451_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0451_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0452_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0452_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0452_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0452_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0453_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0453_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0453_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0453_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0454_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0454_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0454_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0454_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0455_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0455_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0455_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0455_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0456_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0456_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0456_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0456_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0457_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0457_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0457_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0457_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0458_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0458_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0458_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0458_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0459_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0459_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0459_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0459_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0460_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0460_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0460_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0460_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0461_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0461_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0461_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0461_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0462_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0462_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0462_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0462_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0463_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0463_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0463_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0463_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0464_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0464_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0464_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0464_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0465_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0465_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0465_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0465_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0466_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0466_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0466_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0466_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0467_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0467_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0467_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0467_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0468_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0468_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0468_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0468_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0469_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0469_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0469_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0469_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0470_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0470_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0470_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0470_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0471_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0471_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0471_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0471_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0472_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0472_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0472_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0472_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0473_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0473_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0473_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0473_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0474_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0474_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0474_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0474_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0475_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0475_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0475_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0475_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0476_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0476_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0476_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0476_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0477_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0477_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0477_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0477_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0478_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0478_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0478_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0478_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0479_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0479_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0479_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0479_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0480_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0480_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0480_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0480_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0481_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0481_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0481_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0481_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0482_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0482_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0482_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0482_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0483_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0483_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0483_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0483_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0484_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0484_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0484_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0484_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0485_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0485_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0485_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0485_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0486_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0486_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0486_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0486_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0487_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0487_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0487_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0487_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0488_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0488_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0488_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0488_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0489_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0489_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0489_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0489_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0490_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0490_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0490_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0490_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0491_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0491_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0491_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0491_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0492_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0492_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0492_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0492_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0493_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0493_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0493_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0493_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0494_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0494_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0494_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0494_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0495_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0495_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0495_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0495_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0496_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0496_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0496_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0496_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0497_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0497_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0497_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0497_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0498_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0498_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0498_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0498_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0499_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0499_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0499_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0499_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0500_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0500_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0500_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0500_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0501_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0501_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0501_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0501_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0502_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0502_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0502_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0502_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0503_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0503_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0503_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0503_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0504_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0504_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0504_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0504_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0505_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0505_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0505_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0505_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0506_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0506_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0506_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0506_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0507_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0507_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0507_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0507_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0508_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0508_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0508_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0508_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0509_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0509_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0509_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0509_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0510_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0510_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0510_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0510_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0511_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0511_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0511_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0511_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0512_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0512_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0512_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0512_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0513_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0513_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0513_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0513_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0514_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0514_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0514_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0514_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0515_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0515_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0515_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0515_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0516_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0516_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0516_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0516_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0517_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0517_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0517_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0517_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0518_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0518_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0518_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0518_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0519_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0519_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0519_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0519_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0520_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0520_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0520_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0520_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0521_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0521_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0521_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0521_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0522_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0522_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0522_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0522_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0523_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0523_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0523_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0523_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0524_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0524_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0524_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0524_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0525_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0525_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0525_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0525_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0526_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0526_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0526_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0526_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0527_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0527_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0527_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0527_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0528_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0528_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0528_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0528_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0529_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0529_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0529_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0529_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0530_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0530_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0530_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0530_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0531_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0531_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0531_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0531_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0532_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0532_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0532_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0532_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0533_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0533_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0533_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0533_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0534_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0534_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0534_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0534_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0535_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0535_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0535_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0535_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0536_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0536_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0536_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0536_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0537_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0537_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0537_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0537_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0538_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0538_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0538_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0538_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0539_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0539_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0539_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0539_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0540_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0540_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0540_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0540_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0541_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0541_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0541_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0541_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0542_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0542_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0542_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0542_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0543_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0543_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0543_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0543_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0544_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0544_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0544_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0544_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0545_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0545_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0545_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0545_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0546_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0546_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0546_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0546_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0547_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0547_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0547_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0547_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0548_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0548_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0548_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0548_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0549_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0549_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0549_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0549_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0550_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0550_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0550_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0550_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0551_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0551_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0551_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0551_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0552_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0552_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0552_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0552_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0553_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0553_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0553_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0553_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0554_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0554_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0554_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0554_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0555_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0555_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0555_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0555_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0556_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0556_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0556_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0556_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0557_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0557_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0557_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0557_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0558_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0558_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0558_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0558_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0559_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0559_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0559_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0559_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0560_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0560_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0560_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0560_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0561_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0561_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0561_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0561_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0562_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0562_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0562_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0562_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0563_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0563_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0563_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0563_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0564_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0564_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0564_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0564_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0565_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0565_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0565_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0565_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0566_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0566_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0566_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0566_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0567_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0567_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0567_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0567_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0568_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0568_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0568_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0568_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0569_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0569_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0569_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0569_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0570_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0570_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0570_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0570_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0571_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0571_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0571_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0571_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0572_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0572_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0572_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0572_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0573_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0573_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0573_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0573_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0574_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0574_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0574_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0574_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0575_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0575_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0575_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0575_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0576_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0576_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0576_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0576_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0577_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0577_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0577_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0577_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0578_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0578_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0578_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0578_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0579_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0579_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0579_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0579_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0580_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0580_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0580_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0580_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0581_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0581_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0581_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0581_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0582_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0582_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0582_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0582_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0583_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0583_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0583_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0583_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0584_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0584_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0584_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0584_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0585_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0585_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0585_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0585_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0586_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0586_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0586_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0586_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0587_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0587_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0587_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0587_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0588_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0588_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0588_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0588_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0589_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0589_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0589_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0589_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0590_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0590_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0590_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0590_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0591_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0591_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0591_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0591_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0592_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0592_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0592_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0592_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0593_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0593_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0593_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0593_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0594_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0594_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0594_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0594_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0595_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0595_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0595_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0595_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0596_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0596_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0596_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0596_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0597_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0597_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0597_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0597_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0598_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0598_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0598_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0598_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0599_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0599_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0599_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0599_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0600_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0600_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0600_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0600_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0601_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0601_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0601_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0601_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0602_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0602_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0602_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0602_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0603_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0603_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0603_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0603_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0604_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0604_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0604_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0604_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0605_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0605_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0605_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0605_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0606_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0606_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0606_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0606_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0607_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0607_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0607_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0607_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0608_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0608_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0608_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0608_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0609_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0609_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0609_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0609_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0610_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0610_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0610_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0610_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0611_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0611_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0611_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0611_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0612_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0612_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0612_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0612_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0613_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0613_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0613_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0613_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0614_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0614_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0614_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0614_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0615_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0615_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0615_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0615_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0616_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0616_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0616_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0616_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0617_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0617_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0617_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0617_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0618_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0618_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0618_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0618_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0619_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0619_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0619_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0619_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0620_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0620_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0620_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0620_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0621_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0621_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0621_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0621_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0622_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0622_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0622_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0622_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0623_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0623_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0623_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0623_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0624_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0624_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0624_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0624_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0625_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0625_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0625_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0625_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0626_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0626_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0626_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0626_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0627_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0627_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0627_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0627_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0628_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0628_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0628_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0628_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0629_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0629_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0629_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0629_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0630_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0630_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0630_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0630_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0631_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0631_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0631_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0631_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0632_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0632_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0632_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0632_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0633_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0633_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0633_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0633_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0634_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0634_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0634_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0634_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0635_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0635_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0635_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0635_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0636_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0636_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0636_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0636_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0637_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0637_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0637_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0637_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0638_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0638_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0638_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0638_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0639_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0639_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0639_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0639_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0640_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0640_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0640_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0640_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0641_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0641_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0641_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0641_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0642_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0642_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0642_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0642_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0643_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0643_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0643_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0643_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0644_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0644_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0644_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0644_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0645_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0645_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0645_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0645_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0646_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0646_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0646_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0646_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0647_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0647_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0647_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0647_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0648_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0648_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0648_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0648_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0649_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0649_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0649_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0649_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0650_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0650_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0650_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0650_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0651_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0651_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0651_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0651_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0652_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0652_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0652_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0652_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0653_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0653_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0653_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0653_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0654_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0654_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0654_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0654_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0655_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0655_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0655_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0655_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0656_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0656_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0656_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0656_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0657_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0657_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0657_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0657_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0658_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0658_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0658_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0658_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0659_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0659_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0659_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0659_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0660_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0660_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0660_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0660_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0661_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0661_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0661_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0661_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0662_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0662_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0662_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0662_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0663_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0663_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0663_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0663_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0664_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0664_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0664_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0664_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0665_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0665_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0665_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0665_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0666_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0666_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0666_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0666_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0667_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0667_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0667_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0667_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0668_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0668_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0668_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0668_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0669_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0669_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0669_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0669_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0670_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0670_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0670_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0670_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0671_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0671_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0671_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0671_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0672_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0672_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0672_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0672_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0673_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0673_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0673_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0673_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0674_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0674_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0674_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0674_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0675_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0675_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0675_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0675_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0676_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0676_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0676_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0676_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0677_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0677_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0677_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0677_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0678_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0678_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0678_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0678_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0679_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0679_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0679_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0679_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0680_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0680_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0680_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0680_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0681_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0681_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0681_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0681_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0682_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0682_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0682_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0682_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0683_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0683_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0683_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0683_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0684_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0684_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0684_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0684_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0685_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0685_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0685_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0685_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0686_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0686_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0686_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0686_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0687_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0687_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0687_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0687_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0688_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0688_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0688_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0688_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0689_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0689_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0689_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0689_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0690_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0690_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0690_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0690_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0691_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0691_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0691_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0691_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0692_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0692_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0692_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0692_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0693_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0693_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0693_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0693_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0694_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0694_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0694_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0694_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0695_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0695_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0695_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0695_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0696_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0696_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0696_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0696_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0697_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0697_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0697_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0697_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0698_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0698_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0698_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0698_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0699_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0699_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0699_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0699_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0700_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0700_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0700_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0700_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0701_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0701_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0701_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0701_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0702_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0702_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0702_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0702_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0703_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0703_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0703_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0703_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0704_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0704_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0704_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0704_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0705_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0705_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0705_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0705_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0706_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0706_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0706_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0706_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0707_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0707_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0707_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0707_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0708_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0708_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0708_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0708_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0709_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0709_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0709_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0709_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0710_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0710_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0710_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0710_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0711_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0711_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0711_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0711_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0712_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0712_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0712_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0712_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0713_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0713_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0713_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0713_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0714_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0714_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0714_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0714_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0715_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0715_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0715_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0715_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0716_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0716_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0716_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0716_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0717_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0717_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0717_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0717_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0718_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0718_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0718_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0718_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0719_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0719_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0719_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0719_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0720_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0720_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0720_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0720_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0721_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0721_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0721_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0721_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0722_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0722_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0722_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0722_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0723_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0723_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0723_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0723_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0724_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0724_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0724_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0724_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0725_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0725_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0725_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0725_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0726_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0726_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0726_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0726_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0727_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0727_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0727_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0727_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0728_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0728_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0728_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0728_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0729_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0729_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0729_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0729_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0730_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0730_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0730_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0730_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0731_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0731_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0731_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0731_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0732_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0732_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0732_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0732_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0733_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0733_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0733_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0733_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0734_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0734_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0734_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0734_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0735_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0735_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0735_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0735_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0736_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0736_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0736_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0736_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0737_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0737_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0737_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0737_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0738_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0738_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0738_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0738_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0739_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0739_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0739_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0739_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0740_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0740_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0740_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0740_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0741_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0741_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0741_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0741_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0742_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0742_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0742_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0742_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0743_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0743_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0743_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0743_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0744_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0744_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0744_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0744_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0745_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0745_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0745_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0745_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0746_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0746_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0746_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0746_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0747_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0747_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0747_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0747_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0748_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0748_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0748_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0748_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0749_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0749_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0749_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0749_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0750_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0750_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0750_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0750_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0751_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0751_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0751_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0751_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0752_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0752_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0752_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0752_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0753_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0753_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0753_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0753_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0754_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0754_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0754_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0754_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0755_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0755_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0755_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0755_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0756_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0756_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0756_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0756_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0757_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0757_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0757_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0757_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0758_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0758_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0758_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0758_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0759_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0759_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0759_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0759_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0760_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0760_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0760_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0760_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0761_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0761_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0761_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0761_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0762_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0762_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0762_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0762_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0763_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0763_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0763_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0763_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0764_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0764_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0764_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0764_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0765_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0765_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0765_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0765_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0766_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0766_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0766_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0766_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0767_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0767_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0767_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0767_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0768_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0768_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0768_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0768_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0769_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0769_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0769_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0769_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0770_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0770_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0770_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0770_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0771_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0771_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0771_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0771_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0772_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0772_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0772_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0772_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0773_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0773_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0773_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0773_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0774_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0774_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0774_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0774_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0775_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0775_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0775_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0775_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0776_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0776_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0776_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0776_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0777_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0777_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0777_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0777_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0778_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0778_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0778_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0778_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0779_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0779_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0779_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0779_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0780_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0780_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0780_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0780_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0781_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0781_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0781_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0781_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0782_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0782_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0782_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0782_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0783_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0783_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0783_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0783_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0784_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0784_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0784_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0784_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0785_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0785_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0785_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0785_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0786_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0786_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0786_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0786_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0787_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0787_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0787_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0787_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0788_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0788_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0788_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0788_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0789_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0789_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0789_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0789_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0790_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0790_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0790_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0790_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0791_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0791_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0791_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0791_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0792_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0792_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0792_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0792_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0793_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0793_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0793_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0793_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0794_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0794_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0794_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0794_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0795_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0795_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0795_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0795_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0796_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0796_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0796_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0796_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0797_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0797_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0797_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0797_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0798_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0798_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0798_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0798_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0799_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0799_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0799_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0799_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0800_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0800_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0800_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0800_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0801_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0801_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0801_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0801_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0802_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0802_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0802_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0802_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0803_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0803_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0803_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0803_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0804_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0804_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0804_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0804_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0805_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0805_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0805_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0805_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0806_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0806_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0806_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0806_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0807_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0807_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0807_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0807_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0808_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0808_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0808_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0808_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0809_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0809_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0809_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0809_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0810_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0810_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0810_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0810_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0811_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0811_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0811_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0811_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0812_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0812_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0812_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0812_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0813_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0813_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0813_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0813_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0814_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0814_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0814_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0814_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0815_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0815_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0815_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0815_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0816_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0816_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0816_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0816_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0817_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0817_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0817_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0817_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0818_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0818_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0818_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0818_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0819_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0819_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0819_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0819_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0820_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0820_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0820_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0820_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0821_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0821_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0821_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0821_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0822_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0822_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0822_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0822_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0823_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0823_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0823_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0823_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0824_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0824_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0824_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0824_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0825_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0825_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0825_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0825_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0826_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0826_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0826_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0826_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0827_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0827_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0827_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0827_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0828_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0828_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0828_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0828_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0829_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0829_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0829_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0829_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0830_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0830_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0830_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0830_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0831_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0831_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0831_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0831_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0832_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0832_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0832_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0832_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0833_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0833_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0833_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0833_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0834_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0834_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0834_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0834_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0835_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0835_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0835_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0835_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0836_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0836_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0836_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0836_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0837_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0837_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0837_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0837_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0838_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0838_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0838_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0838_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0839_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0839_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0839_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0839_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0840_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0840_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0840_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0840_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0841_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0841_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0841_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0841_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0842_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0842_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0842_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0842_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0843_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0843_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0843_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0843_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0844_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0844_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0844_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0844_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0845_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0845_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0845_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0845_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0846_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0846_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0846_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0846_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0847_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0847_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0847_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0847_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0848_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0848_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0848_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0848_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0849_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0849_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0849_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0849_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0850_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0850_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0850_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0850_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0851_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0851_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0851_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0851_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0852_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0852_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0852_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0852_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0853_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0853_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0853_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0853_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0854_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0854_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0854_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0854_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0855_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0855_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0855_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0855_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0856_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0856_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0856_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0856_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0857_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0857_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0857_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0857_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0858_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0858_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0858_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0858_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0859_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0859_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0859_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0859_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0860_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0860_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0860_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0860_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0861_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0861_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0861_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0861_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0862_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0862_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0862_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0862_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0863_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0863_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0863_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0863_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0864_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0864_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0864_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0864_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0865_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0865_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0865_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0865_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0866_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0866_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0866_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0866_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0867_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0867_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0867_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0867_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0868_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0868_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0868_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0868_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0869_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0869_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0869_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0869_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0870_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0870_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0870_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0870_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0871_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0871_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0871_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0871_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0872_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0872_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0872_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0872_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0873_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0873_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0873_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0873_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0874_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0874_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0874_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0874_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0875_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0875_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0875_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0875_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0876_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0876_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0876_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0876_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0877_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0877_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0877_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0877_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0878_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0878_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0878_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0878_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0879_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0879_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0879_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0879_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0880_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0880_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0880_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0880_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0881_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0881_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0881_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0881_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0882_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0882_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0882_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0882_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0883_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0883_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0883_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0883_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0884_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0884_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0884_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0884_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0885_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0885_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0885_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0885_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0886_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0886_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0886_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0886_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0887_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0887_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0887_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0887_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0888_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0888_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0888_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0888_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0889_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0889_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0889_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0889_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0890_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0890_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0890_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0890_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0891_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0891_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0891_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0891_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0892_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0892_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0892_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0892_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0893_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0893_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0893_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0893_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0894_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0894_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0894_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0894_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0895_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0895_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0895_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0895_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0896_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0896_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0896_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0896_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0897_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0897_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0897_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0897_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0898_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0898_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0898_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0898_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0899_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0899_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0899_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0899_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0900_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0900_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0900_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0900_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0901_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0901_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0901_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0901_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0902_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0902_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0902_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0902_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0903_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0903_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0903_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0903_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0904_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0904_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0904_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0904_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0905_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0905_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0905_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0905_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0906_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0906_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0906_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0906_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0907_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0907_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0907_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0907_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0908_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0908_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0908_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0908_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0909_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0909_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0909_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0909_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0910_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0910_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0910_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0910_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0911_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0911_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0911_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0911_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0912_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0912_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0912_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0912_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0913_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0913_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0913_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0913_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0914_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0914_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0914_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0914_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0915_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0915_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0915_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0915_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0916_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0916_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0916_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0916_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0917_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0917_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0917_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0917_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0918_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0918_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0918_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0918_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0919_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0919_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0919_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0919_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0920_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0920_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0920_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0920_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0921_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0921_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0921_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0921_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0922_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0922_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0922_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0922_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0923_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0923_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0923_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0923_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0924_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0924_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0924_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0924_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0925_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0925_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0925_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0925_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0926_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0926_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0926_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0926_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0927_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0927_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0927_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0927_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0928_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0928_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0928_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0928_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0929_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0929_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0929_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0929_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0930_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0930_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0930_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0930_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0931_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0931_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0931_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0931_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0932_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0932_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0932_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0932_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0933_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0933_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0933_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0933_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0934_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0934_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0934_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0934_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0935_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0935_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0935_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0935_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0936_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0936_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0936_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0936_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0937_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0937_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0937_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0937_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0938_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0938_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0938_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0938_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0939_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0939_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0939_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0939_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0940_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0940_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0940_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0940_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0941_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0941_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0941_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0941_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0942_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0942_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0942_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0942_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0943_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0943_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0943_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0943_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0944_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0944_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0944_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0944_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0945_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0945_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0945_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0945_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0946_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0946_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0946_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0946_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0947_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0947_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0947_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0947_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0948_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0948_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0948_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0948_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0949_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0949_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0949_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0949_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0950_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0950_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0950_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0950_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0951_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0951_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0951_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0951_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0952_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0952_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0952_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0952_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0953_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0953_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0953_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0953_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0954_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0954_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0954_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0954_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0955_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0955_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0955_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0955_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0956_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0956_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0956_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0956_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0957_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0957_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0957_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0957_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0958_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0958_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0958_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0958_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0959_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0959_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0959_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0959_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0960_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0960_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0960_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0960_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0961_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0961_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0961_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0961_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0962_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0962_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0962_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0962_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0963_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0963_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0963_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0963_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0964_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0964_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0964_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0964_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0965_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0965_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0965_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0965_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0966_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0966_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0966_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0966_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0967_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0967_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0967_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0967_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0968_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0968_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0968_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0968_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0969_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0969_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0969_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0969_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0970_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0970_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0970_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0970_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0971_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0971_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0971_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0971_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0972_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0972_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0972_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0972_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0973_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0973_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0973_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0973_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0974_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0974_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0974_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0974_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0975_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0975_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0975_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0975_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0976_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0976_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0976_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0976_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0977_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0977_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0977_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0977_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0978_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0978_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0978_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0978_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0979_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0979_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0979_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0979_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0980_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0980_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0980_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0980_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0981_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0981_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0981_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0981_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0982_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0982_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0982_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0982_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0983_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0983_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0983_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0983_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0984_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0984_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0984_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0984_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0985_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0985_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0985_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0985_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0986_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0986_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0986_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0986_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0987_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0987_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0987_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0987_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0988_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0988_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0988_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0988_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0989_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0989_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0989_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0989_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0990_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0990_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0990_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0990_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0991_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0991_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0991_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0991_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0992_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0992_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0992_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0992_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0993_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0993_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0993_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0993_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0994_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0994_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0994_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0994_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0995_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0995_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0995_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0995_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0996_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0996_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0996_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0996_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0997_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0997_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0997_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0997_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0998_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0998_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0998_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0998_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/0999_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0999_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/0999_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/0999_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1000_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1000_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1000_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1000_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1001_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1001_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1001_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1001_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1002_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1002_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1002_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1002_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1003_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1003_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1003_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1003_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1004_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1004_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1004_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1004_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1005_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1005_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1005_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1005_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1006_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1006_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1006_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1006_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1007_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1007_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1007_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1007_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1008_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1008_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1008_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1008_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1009_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1009_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1009_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1009_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1010_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1010_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1010_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1010_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1011_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1011_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1011_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1011_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1012_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1012_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1012_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1012_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1013_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1013_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1013_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1013_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1014_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1014_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1014_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1014_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1015_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1015_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1015_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1015_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1016_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1016_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1016_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1016_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1017_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1017_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1017_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1017_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1018_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1018_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1018_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1018_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1019_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1019_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1019_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1019_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1020_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1020_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1020_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1020_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1021_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1021_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1021_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1021_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1022_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1022_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1022_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1022_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1023_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1023_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1023_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1023_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1024_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1024_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1024_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1024_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1025_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1025_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1025_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1025_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1026_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1026_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1026_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1026_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1027_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1027_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1027_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1027_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1028_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1028_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1028_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1028_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1029_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1029_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1029_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1029_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1030_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1030_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1030_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1030_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1031_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1031_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1031_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1031_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1032_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1032_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1032_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1032_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1033_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1033_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1033_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1033_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1034_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1034_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1034_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1034_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1035_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1035_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1035_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1035_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1036_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1036_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1036_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1036_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1037_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1037_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1037_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1037_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1038_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1038_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1038_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1038_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1039_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1039_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1039_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1039_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1040_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1040_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1040_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1040_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1041_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1041_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1041_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1041_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1042_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1042_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1042_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1042_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1043_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1043_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1043_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1043_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1044_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1044_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1044_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1044_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1045_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1045_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1045_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1045_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1046_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1046_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1046_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1046_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1047_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1047_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1047_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1047_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1048_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1048_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1048_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1048_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1049_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1049_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1049_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1049_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1050_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1050_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1050_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1050_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1051_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1051_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1051_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1051_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1052_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1052_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1052_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1052_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1053_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1053_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1053_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1053_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1054_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1054_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1054_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1054_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1055_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1055_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1055_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1055_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1056_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1056_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1056_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1056_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1057_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1057_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1057_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1057_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1058_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1058_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1058_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1058_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1059_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1059_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1059_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1059_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1060_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1060_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1060_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1060_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1061_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1061_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1061_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1061_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1062_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1062_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1062_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1062_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1063_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1063_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1063_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1063_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1064_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1064_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1064_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1064_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1065_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1065_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1065_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1065_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1066_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1066_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1066_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1066_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1067_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1067_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1067_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1067_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1068_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1068_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1068_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1068_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1069_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1069_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1069_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1069_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1070_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1070_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1070_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1070_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1071_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1071_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1071_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1071_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1072_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1072_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1072_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1072_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1073_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1073_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1073_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1073_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1074_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1074_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1074_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1074_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1075_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1075_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1075_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1075_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1076_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1076_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1076_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1076_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1077_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1077_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1077_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1077_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1078_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1078_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1078_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1078_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1079_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1079_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1079_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1079_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1080_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1080_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1080_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1080_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1081_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1081_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1081_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1081_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1082_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1082_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1082_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1082_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1083_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1083_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1083_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1083_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1084_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1084_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1084_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1084_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1085_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1085_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1085_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1085_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1086_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1086_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1086_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1086_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1087_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1087_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1087_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1087_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1088_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1088_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1088_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1088_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1089_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1089_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1089_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1089_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1090_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1090_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1090_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1090_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1091_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1091_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1091_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1091_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1092_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1092_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1092_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1092_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1093_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1093_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1093_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1093_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1094_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1094_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1094_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1094_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1095_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1095_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1095_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1095_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1096_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1096_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1096_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1096_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1097_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1097_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1097_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1097_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1098_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1098_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1098_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1098_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1099_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1099_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1099_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1099_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1100_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1100_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1100_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1100_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1101_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1101_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1101_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1101_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1102_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1102_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1102_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1102_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1103_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1103_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1103_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1103_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1104_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1104_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1104_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1104_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1105_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1105_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1105_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1105_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1106_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1106_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1106_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1106_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1107_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1107_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1107_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1107_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1108_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1108_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1108_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1108_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1109_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1109_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1109_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1109_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1110_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1110_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1110_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1110_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1111_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1111_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1111_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1111_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1112_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1112_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1112_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1112_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1113_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1113_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1113_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1113_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1114_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1114_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1114_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1114_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1115_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1115_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1115_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1115_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1116_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1116_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1116_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1116_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1117_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1117_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1117_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1117_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1118_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1118_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1118_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1118_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1119_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1119_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1119_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1119_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1120_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1120_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1120_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1120_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1121_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1121_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1121_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1121_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1122_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1122_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1122_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1122_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1123_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1123_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1123_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1123_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1124_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1124_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1124_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1124_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1125_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1125_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1125_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1125_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1126_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1126_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1126_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1126_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1127_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1127_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1127_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1127_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1128_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1128_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1128_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1128_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1129_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1129_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1129_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1129_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1130_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1130_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1130_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1130_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1131_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1131_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1131_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1131_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1132_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1132_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1132_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1132_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1133_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1133_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1133_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1133_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1134_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1134_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1134_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1134_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1135_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1135_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1135_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1135_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1136_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1136_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1136_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1136_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1137_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1137_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1137_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1137_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1138_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1138_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1138_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1138_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1139_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1139_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1139_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1139_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1140_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1140_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1140_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1140_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1141_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1141_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1141_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1141_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1142_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1142_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1142_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1142_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1143_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1143_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1143_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1143_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1144_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1144_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1144_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1144_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1145_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1145_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1145_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1145_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1146_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1146_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1146_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1146_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1147_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1147_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1147_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1147_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1148_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1148_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1148_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1148_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1149_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1149_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1149_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1149_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1150_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1150_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1150_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1150_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1151_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1151_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1151_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1151_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1152_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1152_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1152_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1152_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1153_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1153_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1153_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1153_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1154_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1154_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1154_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1154_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1155_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1155_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1155_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1155_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1156_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1156_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1156_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1156_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1157_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1157_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1157_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1157_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1158_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1158_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1158_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1158_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1159_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1159_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1159_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1159_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1160_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1160_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1160_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1160_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1161_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1161_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1161_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1161_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1162_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1162_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1162_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1162_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1163_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1163_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1163_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1163_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1164_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1164_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1164_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1164_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1165_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1165_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1165_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1165_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1166_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1166_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1166_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1166_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1167_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1167_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1167_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1167_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1168_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1168_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1168_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1168_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1169_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1169_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1169_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1169_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1170_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1170_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1170_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1170_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1171_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1171_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1171_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1171_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1172_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1172_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1172_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1172_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1173_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1173_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1173_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1173_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1174_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1174_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1174_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1174_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1175_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1175_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1175_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1175_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1176_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1176_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1176_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1176_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1177_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1177_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1177_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1177_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1178_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1178_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1178_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1178_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1179_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1179_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1179_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1179_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1180_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1180_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1180_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1180_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1181_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1181_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1181_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1181_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1182_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1182_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1182_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1182_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1183_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1183_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1183_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1183_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1184_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1184_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1184_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1184_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1185_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1185_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1185_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1185_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1186_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1186_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1186_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1186_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1187_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1187_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1187_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1187_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1188_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1188_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1188_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1188_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1189_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1189_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1189_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1189_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1190_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1190_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1190_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1190_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1191_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1191_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1191_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1191_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1192_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1192_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1192_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1192_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1193_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1193_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1193_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1193_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1194_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1194_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1194_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1194_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1195_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1195_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1195_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1195_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1196_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1196_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1196_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1196_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1197_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1197_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1197_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1197_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1198_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1198_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1198_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1198_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1199_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1199_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1199_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1199_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1200_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1200_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1200_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1200_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/csr/1201_csr-certbot.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1201_csr-certbot.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/csr/1201_csr-certbot.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/csr/1201_csr-certbot.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/README b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/README similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/README rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/README diff --git a/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/README b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/README similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/README rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/README diff --git a/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/cert.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/cert.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/cert.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/cert.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/chain.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/chain.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/chain.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/chain.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/fullchain.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/fullchain.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/fullchain.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/fullchain.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/privkey.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/privkey.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/privkey.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/dip-zero.geumdo.net/privkey.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/README b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/README similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/README rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/README diff --git a/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/cert.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/cert.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/cert.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/cert.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/chain.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/chain.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/chain.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/chain.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/fullchain.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/fullchain.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/fullchain.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/fullchain.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/privkey.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/privkey.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/privkey.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/mail.geumdo.net/privkey.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/README b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/README similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/README rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/README diff --git a/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/cert.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/cert.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/cert.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/cert.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/chain.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/chain.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/chain.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/chain.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/fullchain.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/fullchain.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/fullchain.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/fullchain.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/privkey.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/privkey.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/privkey.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/live/proxy.geumdo.net/privkey.pem diff --git a/docker/docker_nginx_proxy/letsencrypt/options-ssl-nginx.conf b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/options-ssl-nginx.conf similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/options-ssl-nginx.conf rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/options-ssl-nginx.conf diff --git a/docker/docker_nginx_proxy/letsencrypt/renewal/dip-zero.geumdo.net.conf b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/renewal/dip-zero.geumdo.net.conf similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/renewal/dip-zero.geumdo.net.conf rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/renewal/dip-zero.geumdo.net.conf diff --git a/docker/docker_nginx_proxy/letsencrypt/renewal/mail.geumdo.net.conf b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/renewal/mail.geumdo.net.conf similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/renewal/mail.geumdo.net.conf rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/renewal/mail.geumdo.net.conf diff --git a/docker/docker_nginx_proxy/letsencrypt/renewal/proxy.geumdo.net.conf b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/renewal/proxy.geumdo.net.conf similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/renewal/proxy.geumdo.net.conf rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/renewal/proxy.geumdo.net.conf diff --git a/docker/docker_nginx_proxy/letsencrypt/ssl-dhparams.pem b/1_infrastructure/docker/docker_nginx_proxy/letsencrypt/ssl-dhparams.pem similarity index 100% rename from docker/docker_nginx_proxy/letsencrypt/ssl-dhparams.pem rename to 1_infrastructure/docker/docker_nginx_proxy/letsencrypt/ssl-dhparams.pem diff --git a/docker/docker_nginx_proxy/nginx.conf b/1_infrastructure/docker/docker_nginx_proxy/nginx.conf similarity index 100% rename from docker/docker_nginx_proxy/nginx.conf rename to 1_infrastructure/docker/docker_nginx_proxy/nginx.conf diff --git a/docker/docker_nginx_proxy/rebuild_docker.sh b/1_infrastructure/docker/docker_nginx_proxy/rebuild_docker.sh similarity index 100% rename from docker/docker_nginx_proxy/rebuild_docker.sh rename to 1_infrastructure/docker/docker_nginx_proxy/rebuild_docker.sh diff --git a/docker/docker_nginx_proxy/sites-available/3dp_nextcloud.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/3dp_nextcloud.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/3dp_nextcloud.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/3dp_nextcloud.conf diff --git a/docker/docker_nginx_proxy/sites-available/ai_was.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/ai_was.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/ai_was.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/ai_was.conf diff --git a/docker/docker_nginx_proxy/sites-available/default b/1_infrastructure/docker/docker_nginx_proxy/sites-available/default similarity index 100% rename from docker/docker_nginx_proxy/sites-available/default rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/default diff --git a/docker/docker_nginx_proxy/sites-available/dmi.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/dmi.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/dmi.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/dmi.conf diff --git a/docker/docker_nginx_proxy/sites-available/fastapi.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/fastapi.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/fastapi.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/fastapi.conf diff --git a/docker/docker_nginx_proxy/sites-available/flask_proxy.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/flask_proxy.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/flask_proxy.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/flask_proxy.conf diff --git a/docker/docker_nginx_proxy/sites-available/flaskapi.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/flaskapi.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/flaskapi.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/flaskapi.conf diff --git a/docker/docker_nginx_proxy/sites-available/geumdo_java_upgrade.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/geumdo_java_upgrade.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/geumdo_java_upgrade.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/geumdo_java_upgrade.conf diff --git a/docker/docker_nginx_proxy/sites-available/geumdo_java_upgrade_http.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/geumdo_java_upgrade_http.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/geumdo_java_upgrade_http.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/geumdo_java_upgrade_http.conf diff --git a/docker/docker_nginx_proxy/sites-available/geumdo_ollama_docker.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/geumdo_ollama_docker.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/geumdo_ollama_docker.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/geumdo_ollama_docker.conf diff --git a/docker/docker_nginx_proxy/sites-available/geumdo_ollamaui_docker.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/geumdo_ollamaui_docker.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/geumdo_ollamaui_docker.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/geumdo_ollamaui_docker.conf diff --git a/docker/docker_nginx_proxy/sites-available/jupyter.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/jupyter.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/jupyter.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/jupyter.conf diff --git a/docker/docker_nginx_proxy/sites-available/posteio.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/posteio.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/posteio.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/posteio.conf diff --git a/docker/docker_nginx_proxy/sites-available/sw3d-dev.conf b/1_infrastructure/docker/docker_nginx_proxy/sites-available/sw3d-dev.conf similarity index 100% rename from docker/docker_nginx_proxy/sites-available/sw3d-dev.conf rename to 1_infrastructure/docker/docker_nginx_proxy/sites-available/sw3d-dev.conf diff --git a/docker/docker_nginx_proxy/ssl-certs/nginx.crt b/1_infrastructure/docker/docker_nginx_proxy/ssl-certs/nginx.crt similarity index 100% rename from docker/docker_nginx_proxy/ssl-certs/nginx.crt rename to 1_infrastructure/docker/docker_nginx_proxy/ssl-certs/nginx.crt diff --git a/docker/docker_nginx_proxy/ssl-certs/nginx.key b/1_infrastructure/docker/docker_nginx_proxy/ssl-certs/nginx.key similarity index 100% rename from docker/docker_nginx_proxy/ssl-certs/nginx.key rename to 1_infrastructure/docker/docker_nginx_proxy/ssl-certs/nginx.key diff --git a/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.key b/1_infrastructure/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.key similarity index 100% rename from docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.key rename to 1_infrastructure/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.key diff --git a/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.p7b b/1_infrastructure/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.p7b similarity index 100% rename from docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.p7b rename to 1_infrastructure/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.p7b diff --git a/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.pem b/1_infrastructure/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.pem similarity index 100% rename from docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.pem rename to 1_infrastructure/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.pem diff --git a/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.private.key b/1_infrastructure/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.private.key similarity index 100% rename from docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.private.key rename to 1_infrastructure/docker/docker_nginx_proxy/ssl/gdlab.co.kr/gdlab.co.kr.private.key diff --git a/docker/docker_nginx_proxy/ssl/gdlab.co.kr/key.pem b/1_infrastructure/docker/docker_nginx_proxy/ssl/gdlab.co.kr/key.pem similarity index 100% rename from docker/docker_nginx_proxy/ssl/gdlab.co.kr/key.pem rename to 1_infrastructure/docker/docker_nginx_proxy/ssl/gdlab.co.kr/key.pem diff --git a/docker/docker_nginx_proxy/ssl/geumdo.net/DigiCertCAG1.crt b/1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/DigiCertCAG1.crt similarity index 100% rename from docker/docker_nginx_proxy/ssl/geumdo.net/DigiCertCAG1.crt rename to 1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/DigiCertCAG1.crt diff --git a/docker/docker_nginx_proxy/ssl/geumdo.net/TrustedRootG2.crt b/1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/TrustedRootG2.crt similarity index 100% rename from docker/docker_nginx_proxy/ssl/geumdo.net/TrustedRootG2.crt rename to 1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/TrustedRootG2.crt diff --git a/docker/docker_nginx_proxy/ssl/geumdo.net/bundle.pem b/1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/bundle.pem similarity index 100% rename from docker/docker_nginx_proxy/ssl/geumdo.net/bundle.pem rename to 1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/bundle.pem diff --git a/docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.crt b/1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.crt similarity index 100% rename from docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.crt rename to 1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.crt diff --git a/docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.csr b/1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.csr similarity index 100% rename from docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.csr rename to 1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.csr diff --git a/docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.key b/1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.key similarity index 100% rename from docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.key rename to 1_infrastructure/docker/docker_nginx_proxy/ssl/geumdo.net/geumdo.net.key diff --git a/docker/docker_nginx_proxy/start_service.sh b/1_infrastructure/docker/docker_nginx_proxy/start_service.sh similarity index 100% rename from docker/docker_nginx_proxy/start_service.sh rename to 1_infrastructure/docker/docker_nginx_proxy/start_service.sh diff --git a/1_infrastructure/docker/docker_open_webui/.gitignore b/1_infrastructure/docker/docker_open_webui/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..32271f8087e213e83089162bd0b1ec99c60d45ca --- /dev/null +++ b/1_infrastructure/docker/docker_open_webui/.gitignore @@ -0,0 +1,309 @@ +.DS_Store +node_modules +/build +/.svelte-kit +/package +.env +.env.* +!.env.example +vite.config.js.timestamp-* +vite.config.ts.timestamp-* +# Byte-compiled / optimized / DLL files +__pycache__/ +*.py[cod] +*$py.class + +# C extensions +*.so + +# Pyodide distribution +static/pyodide/* +!static/pyodide/pyodide-lock.json + +# Distribution / packaging +.Python +build/ +develop-eggs/ +dist/ +downloads/ +eggs/ +.eggs/ +lib64/ +parts/ +sdist/ +var/ +wheels/ +share/python-wheels/ +*.egg-info/ +.installed.cfg +*.egg +MANIFEST + +# PyInstaller +# Usually these files are written by a python script from a template +# before PyInstaller builds the exe, so as to inject date/other infos into it. +*.manifest +*.spec + +# Installer logs +pip-log.txt +pip-delete-this-directory.txt + +# Unit test / coverage reports +htmlcov/ +.tox/ +.nox/ +.coverage +.coverage.* +.cache +nosetests.xml +coverage.xml +*.cover +*.py,cover +.hypothesis/ +.pytest_cache/ +cover/ + +# Translations +*.mo +*.pot + +# Django stuff: +*.log +local_settings.py +db.sqlite3 +db.sqlite3-journal + +# Flask stuff: +instance/ +.webassets-cache + +# Scrapy stuff: +.scrapy + +# Sphinx documentation +docs/_build/ + +# PyBuilder +.pybuilder/ +target/ + +# Jupyter Notebook +.ipynb_checkpoints + +# IPython +profile_default/ +ipython_config.py + +# pyenv +# For a library or package, you might want to ignore these files since the code is +# intended to run in multiple environments; otherwise, check them in: +# .python-version + +# pipenv +# According to pypa/pipenv#598, it is recommended to include Pipfile.lock in version control. +# However, in case of collaboration, if having platform-specific dependencies or dependencies +# having no cross-platform support, pipenv may install dependencies that don't work, or not +# install all needed dependencies. +#Pipfile.lock + +# poetry +# Similar to Pipfile.lock, it is generally recommended to include poetry.lock in version control. +# This is especially recommended for binary packages to ensure reproducibility, and is more +# commonly ignored for libraries. +# https://python-poetry.org/docs/basic-usage/#commit-your-poetrylock-file-to-version-control +#poetry.lock + +# pdm +# Similar to Pipfile.lock, it is generally recommended to include pdm.lock in version control. +#pdm.lock +# pdm stores project-wide configurations in .pdm.toml, but it is recommended to not include it +# in version control. +# https://pdm.fming.dev/#use-with-ide +.pdm.toml + +# PEP 582; used by e.g. github.com/David-OConnor/pyflow and github.com/pdm-project/pdm +__pypackages__/ + +# Celery stuff +celerybeat-schedule +celerybeat.pid + +# SageMath parsed files +*.sage.py + +# Environments +.env +.venv +env/ +venv/ +ENV/ +env.bak/ +venv.bak/ + +# Spyder project settings +.spyderproject +.spyproject + +# Rope project settings +.ropeproject + +# mkdocs documentation +/site + +# mypy +.mypy_cache/ +.dmypy.json +dmypy.json + +# Pyre type checker +.pyre/ + +# pytype static type analyzer +.pytype/ + +# Cython debug symbols +cython_debug/ + +# PyCharm +# JetBrains specific template is maintained in a separate JetBrains.gitignore that can +# be found at https://github.com/github/gitignore/blob/main/Global/JetBrains.gitignore +# and can be added to the global gitignore or merged into this file. For a more nuclear +# option (not recommended) you can uncomment the following to ignore the entire idea folder. +.idea/ + +# Logs +logs +*.log +npm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +.pnpm-debug.log* + +# Diagnostic reports (https://nodejs.org/api/report.html) +report.[0-9]*.[0-9]*.[0-9]*.[0-9]*.json + +# Runtime data +pids +*.pid +*.seed +*.pid.lock + +# Directory for instrumented libs generated by jscoverage/JSCover +lib-cov + +# Coverage directory used by tools like istanbul +coverage +*.lcov + +# nyc test coverage +.nyc_output + +# Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) +.grunt + +# Bower dependency directory (https://bower.io/) +bower_components + +# node-waf configuration +.lock-wscript + +# Compiled binary addons (https://nodejs.org/api/addons.html) +build/Release + +# Dependency directories +node_modules/ +jspm_packages/ + +# Snowpack dependency directory (https://snowpack.dev/) +web_modules/ + +# TypeScript cache +*.tsbuildinfo + +# Optional npm cache directory +.npm + +# Optional eslint cache +.eslintcache + +# Optional stylelint cache +.stylelintcache + +# Microbundle cache +.rpt2_cache/ +.rts2_cache_cjs/ +.rts2_cache_es/ +.rts2_cache_umd/ + +# Optional REPL history +.node_repl_history + +# Output of 'npm pack' +*.tgz + +# Yarn Integrity file +.yarn-integrity + +# dotenv environment variable files +.env +.env.development.local +.env.test.local +.env.production.local +.env.local + +# parcel-bundler cache (https://parceljs.org/) +.cache +.parcel-cache + +# Next.js build output +.next +out + +# Nuxt.js build / generate output +.nuxt +dist + +# Gatsby files +.cache/ +# Comment in the public line in if your project uses Gatsby and not Next.js +# https://nextjs.org/blog/next-9-1#public-directory-support +# public + +# vuepress build output +.vuepress/dist + +# vuepress v2.x temp and cache directory +.temp +.cache + +# Docusaurus cache and generated files +.docusaurus + +# Serverless directories +.serverless/ + +# FuseBox cache +.fusebox/ + +# DynamoDB Local files +.dynamodb/ + +# TernJS port file +.tern-port + +# Stores VSCode versions used for testing VSCode extensions +.vscode-test + +# yarn v2 +.yarn/cache +.yarn/unplugged +.yarn/build-state.yml +.yarn/install-state.gz +.pnp.* + +# cypress artifacts +cypress/videos +cypress/screenshots +.vscode/settings.json diff --git a/1_infrastructure/docker/docker_open_webui/Dockerfile b/1_infrastructure/docker/docker_open_webui/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..679d7ae27c2e924cae69ed9e5b18b55886017aec --- /dev/null +++ b/1_infrastructure/docker/docker_open_webui/Dockerfile @@ -0,0 +1,161 @@ +# syntax=docker/dockerfile:1 +# Initialize device type args +# use build args in the docker build commmand with --build-arg="BUILDARG=true" +ARG USE_CUDA=false +ARG USE_OLLAMA=false +# Tested with cu117 for CUDA 11 and cu121 for CUDA 12 (default) +ARG USE_CUDA_VER=cu121 +# any sentence transformer model; models to use can be found at https://huggingface.co/models?library=sentence-transformers +# Leaderboard: https://huggingface.co/spaces/mteb/leaderboard +# for better performance and multilangauge support use "intfloat/multilingual-e5-large" (~2.5GB) or "intfloat/multilingual-e5-base" (~1.5GB) +# IMPORTANT: If you change the embedding model (sentence-transformers/all-MiniLM-L6-v2) and vice versa, you aren't able to use RAG Chat with your previous documents loaded in the WebUI! You need to re-embed them. +ARG USE_EMBEDDING_MODEL=sentence-transformers/all-MiniLM-L6-v2 +ARG USE_RERANKING_MODEL="" +ARG BUILD_HASH=dev-build +# Override at your own risk - non-root configurations are untested +ARG UID=0 +ARG GID=0 + +######## WebUI frontend ######## +FROM --platform=$BUILDPLATFORM node:21-alpine3.19 as build +ARG BUILD_HASH + +WORKDIR /app + +COPY package.json package-lock.json ./ +RUN npm ci + +COPY . . +ENV APP_BUILD_HASH=${BUILD_HASH} +RUN npm run build + +######## WebUI backend ######## +FROM python:3.11-slim-bookworm as base + +# Use args +ARG USE_CUDA +ARG USE_OLLAMA +ARG USE_CUDA_VER +ARG USE_EMBEDDING_MODEL +ARG USE_RERANKING_MODEL +ARG UID +ARG GID + +## Basis ## +ENV ENV=prod \ + PORT=8080 \ + # pass build args to the build + USE_OLLAMA_DOCKER=${USE_OLLAMA} \ + USE_CUDA_DOCKER=${USE_CUDA} \ + USE_CUDA_DOCKER_VER=${USE_CUDA_VER} \ + USE_EMBEDDING_MODEL_DOCKER=${USE_EMBEDDING_MODEL} \ + USE_RERANKING_MODEL_DOCKER=${USE_RERANKING_MODEL} + +## Basis URL Config ## +ENV OLLAMA_BASE_URL="/ollama" \ + OPENAI_API_BASE_URL="" + +## API Key and Security Config ## +ENV OPENAI_API_KEY="" \ + WEBUI_SECRET_KEY="" \ + SCARF_NO_ANALYTICS=true \ + DO_NOT_TRACK=true \ + ANONYMIZED_TELEMETRY=false + +#### Other models ######################################################### +## whisper TTS model settings ## +ENV WHISPER_MODEL="base" \ + WHISPER_MODEL_DIR="/app/backend/data/cache/whisper/models" + +## RAG Embedding model settings ## +ENV RAG_EMBEDDING_MODEL="$USE_EMBEDDING_MODEL_DOCKER" \ + RAG_RERANKING_MODEL="$USE_RERANKING_MODEL_DOCKER" \ + SENTENCE_TRANSFORMERS_HOME="/app/backend/data/cache/embedding/models" + +## Hugging Face download cache ## +ENV HF_HOME="/app/backend/data/cache/embedding/models" +#### Other models ########################################################## + +WORKDIR /app/backend + +ENV HOME /root +# Create user and group if not root +RUN if [ $UID -ne 0 ]; then \ + if [ $GID -ne 0 ]; then \ + addgroup --gid $GID app; \ + fi; \ + adduser --uid $UID --gid $GID --home $HOME --disabled-password --no-create-home app; \ + fi + +RUN mkdir -p $HOME/.cache/chroma +RUN echo -n 00000000-0000-0000-0000-000000000000 > $HOME/.cache/chroma/telemetry_user_id + +# Make sure the user has access to the app and root directory +RUN chown -R $UID:$GID /app $HOME + +RUN if [ "$USE_OLLAMA" = "true" ]; then \ + apt-get update && \ + # Install pandoc and netcat + apt-get install -y --no-install-recommends pandoc netcat-openbsd curl && \ + apt-get install -y --no-install-recommends gcc python3-dev && \ + # for RAG OCR + apt-get install -y --no-install-recommends ffmpeg libsm6 libxext6 && \ + # install helper tools + apt-get install -y --no-install-recommends curl jq && \ + # install ollama + curl -fsSL https://ollama.com/install.sh | sh && \ + # cleanup + rm -rf /var/lib/apt/lists/*; \ + else \ + apt-get update && \ + # Install pandoc, netcat and gcc + apt-get install -y --no-install-recommends pandoc gcc netcat-openbsd curl jq && \ + apt-get install -y --no-install-recommends gcc python3-dev && \ + # for RAG OCR + apt-get install -y --no-install-recommends ffmpeg libsm6 libxext6 && \ + # cleanup + rm -rf /var/lib/apt/lists/*; \ + fi + +# install python dependencies +COPY --chown=$UID:$GID ./backend/requirements.txt ./requirements.txt + +RUN pip3 install uv && \ + if [ "$USE_CUDA" = "true" ]; then \ + # If you use CUDA the whisper and embedding model will be downloaded on first use + pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/$USE_CUDA_DOCKER_VER --no-cache-dir && \ + uv pip install --system -r requirements.txt --no-cache-dir && \ + python -c "import os; from sentence_transformers import SentenceTransformer; SentenceTransformer(os.environ['RAG_EMBEDDING_MODEL'], device='cpu')" && \ + python -c "import os; from faster_whisper import WhisperModel; WhisperModel(os.environ['WHISPER_MODEL'], device='cpu', compute_type='int8', download_root=os.environ['WHISPER_MODEL_DIR'])"; \ + else \ + pip3 install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cpu --no-cache-dir && \ + uv pip install --system -r requirements.txt --no-cache-dir && \ + python -c "import os; from sentence_transformers import SentenceTransformer; SentenceTransformer(os.environ['RAG_EMBEDDING_MODEL'], device='cpu')" && \ + python -c "import os; from faster_whisper import WhisperModel; WhisperModel(os.environ['WHISPER_MODEL'], device='cpu', compute_type='int8', download_root=os.environ['WHISPER_MODEL_DIR'])"; \ + fi; \ + chown -R $UID:$GID /app/backend/data/ + + + +# copy embedding weight from build +# RUN mkdir -p /root/.cache/chroma/onnx_models/all-MiniLM-L6-v2 +# COPY --from=build /app/onnx /root/.cache/chroma/onnx_models/all-MiniLM-L6-v2/onnx + +# copy built frontend files +COPY --chown=$UID:$GID --from=build /app/build /app/build +COPY --chown=$UID:$GID --from=build /app/CHANGELOG.md /app/CHANGELOG.md +COPY --chown=$UID:$GID --from=build /app/package.json /app/package.json + +# copy backend files +COPY --chown=$UID:$GID ./backend . + +EXPOSE 8080 11434 + +HEALTHCHECK CMD curl --silent --fail http://localhost:8080/health | jq -e '.status == true' || exit 1 + +USER $UID:$GID + +ARG BUILD_HASH +ENV WEBUI_BUILD_VERSION=${BUILD_HASH} + +CMD [ "bash", "start.sh"] diff --git a/1_infrastructure/docker/docker_open_webui/README.md b/1_infrastructure/docker/docker_open_webui/README.md new file mode 100644 index 0000000000000000000000000000000000000000..f3cfe0d274e80b10947d15f86bc327e748d45d64 --- /dev/null +++ b/1_infrastructure/docker/docker_open_webui/README.md @@ -0,0 +1,203 @@ +# Open WebUI (Formerly Ollama WebUI) 👋 + +![GitHub stars](https://img.shields.io/github/stars/open-webui/open-webui?style=social) +![GitHub forks](https://img.shields.io/github/forks/open-webui/open-webui?style=social) +![GitHub watchers](https://img.shields.io/github/watchers/open-webui/open-webui?style=social) +![GitHub repo size](https://img.shields.io/github/repo-size/open-webui/open-webui) +![GitHub language count](https://img.shields.io/github/languages/count/open-webui/open-webui) +![GitHub top language](https://img.shields.io/github/languages/top/open-webui/open-webui) +![GitHub last commit](https://img.shields.io/github/last-commit/open-webui/open-webui?color=red) +![Hits](https://hits.seeyoufarm.com/api/count/incr/badge.svg?url=https%3A%2F%2Fgithub.com%2Follama-webui%2Follama-wbui&count_bg=%2379C83D&title_bg=%23555555&icon=&icon_color=%23E7E7E7&title=hits&edge_flat=false) +[![Discord](https://img.shields.io/badge/Discord-Open_WebUI-blue?logo=discord&logoColor=white)](https://discord.gg/5rJgQTnV4s) +[![](https://img.shields.io/static/v1?label=Sponsor&message=%E2%9D%A4&logo=GitHub&color=%23fe8e86)](https://github.com/sponsors/tjbck) + +Open WebUI is an [extensible](https://github.com/open-webui/pipelines), feature-rich, and user-friendly self-hosted WebUI designed to operate entirely offline. It supports various LLM runners, including Ollama and OpenAI-compatible APIs. For more information, be sure to check out our [Open WebUI Documentation](https://docs.openwebui.com/). + +![Open WebUI Demo](./demo.gif) + +## Key Features of Open WebUI ⭐ + +- 🚀 **Effortless Setup**: Install seamlessly using Docker or Kubernetes (kubectl, kustomize or helm) for a hassle-free experience with support for both `:ollama` and `:cuda` tagged images. + +- 🤝 **Ollama/OpenAI API Integration**: Effortlessly integrate OpenAI-compatible APIs for versatile conversations alongside Ollama models. Customize the OpenAI API URL to link with **LMStudio, GroqCloud, Mistral, OpenRouter, and more**. + +- 🧩 **Pipelines, Open WebUI Plugin Support**: Seamlessly integrate custom logic and Python libraries into Open WebUI using [Pipelines Plugin Framework](https://github.com/open-webui/pipelines). Launch your Pipelines instance, set the OpenAI URL to the Pipelines URL, and explore endless possibilities. [Examples](https://github.com/open-webui/pipelines/tree/main/examples) include **Function Calling**, User **Rate Limiting** to control access, **Usage Monitoring** with tools like Langfuse, **Live Translation with LibreTranslate** for multilingual support, **Toxic Message Filtering** and much more. + +- 📱 **Responsive Design**: Enjoy a seamless experience across Desktop PC, Laptop, and Mobile devices. + +- 📱 **Progressive Web App (PWA) for Mobile**: Enjoy a native app-like experience on your mobile device with our PWA, providing offline access on localhost and a seamless user interface. + +- ✒️🔢 **Full Markdown and LaTeX Support**: Elevate your LLM experience with comprehensive Markdown and LaTeX capabilities for enriched interaction. + +- 🎤📹 **Hands-Free Voice/Video Call**: Experience seamless communication with integrated hands-free voice and video call features, allowing for a more dynamic and interactive chat environment. + +- 🛠️ **Model Builder**: Easily create Ollama models via the Web UI. Create and add custom characters/agents, customize chat elements, and import models effortlessly through [Open WebUI Community](https://openwebui.com/) integration. + +- 🐍 **Native Python Function Calling Tool**: Enhance your LLMs with built-in code editor support in the tools workspace. Bring Your Own Function (BYOF) by simply adding your pure Python functions, enabling seamless integration with LLMs. + +- 📚 **Local RAG Integration**: Dive into the future of chat interactions with groundbreaking Retrieval Augmented Generation (RAG) support. This feature seamlessly integrates document interactions into your chat experience. You can load documents directly into the chat or add files to your document library, effortlessly accessing them using the `#` command before a query. + +- 🔍 **Web Search for RAG**: Perform web searches using providers like `SearXNG`, `Google PSE`, `Brave Search`, `serpstack`, `serper`, `Serply`, `DuckDuckGo` and `TavilySearch` and inject the results directly into your chat experience. + +- 🌐 **Web Browsing Capability**: Seamlessly integrate websites into your chat experience using the `#` command followed by a URL. This feature allows you to incorporate web content directly into your conversations, enhancing the richness and depth of your interactions. + +- 🎨 **Image Generation Integration**: Seamlessly incorporate image generation capabilities using options such as AUTOMATIC1111 API or ComfyUI (local), and OpenAI's DALL-E (external), enriching your chat experience with dynamic visual content. + +- ⚙️ **Many Models Conversations**: Effortlessly engage with various models simultaneously, harnessing their unique strengths for optimal responses. Enhance your experience by leveraging a diverse set of models in parallel. + +- 🔐 **Role-Based Access Control (RBAC)**: Ensure secure access with restricted permissions; only authorized individuals can access your Ollama, and exclusive model creation/pulling rights are reserved for administrators. + +- 🌐🌍 **Multilingual Support**: Experience Open WebUI in your preferred language with our internationalization (i18n) support. Join us in expanding our supported languages! We're actively seeking contributors! + +- 🌟 **Continuous Updates**: We are committed to improving Open WebUI with regular updates, fixes, and new features. + +Want to learn more about Open WebUI's features? Check out our [Open WebUI documentation](https://docs.openwebui.com/features) for a comprehensive overview! + +## 🔗 Also Check Out Open WebUI Community! + +Don't forget to explore our sibling project, [Open WebUI Community](https://openwebui.com/), where you can discover, download, and explore customized Modelfiles. Open WebUI Community offers a wide range of exciting possibilities for enhancing your chat interactions with Open WebUI! 🚀 + +## How to Install 🚀 + +> [!NOTE] +> Please note that for certain Docker environments, additional configurations might be needed. If you encounter any connection issues, our detailed guide on [Open WebUI Documentation](https://docs.openwebui.com/) is ready to assist you. + +### Quick Start with Docker 🐳 + +> [!WARNING] +> When using Docker to install Open WebUI, make sure to include the `-v open-webui:/app/backend/data` in your Docker command. This step is crucial as it ensures your database is properly mounted and prevents any loss of data. + +> [!TIP] +> If you wish to utilize Open WebUI with Ollama included or CUDA acceleration, we recommend utilizing our official images tagged with either `:cuda` or `:ollama`. To enable CUDA, you must install the [Nvidia CUDA container toolkit](https://docs.nvidia.com/dgx/nvidia-container-runtime-upgrade/) on your Linux/WSL system. + +### Installation with Default Configuration + +- **If Ollama is on your computer**, use this command: + + ```bash + docker run -d -p 3000:8080 --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main + ``` + +- **If Ollama is on a Different Server**, use this command: + + To connect to Ollama on another server, change the `OLLAMA_BASE_URL` to the server's URL: + + ```bash + docker run -d -p 3000:8080 -e OLLAMA_BASE_URL=https://example.com -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main + ``` + + - **To run Open WebUI with Nvidia GPU support**, use this command: + + ```bash + docker run -d -p 3000:8080 --gpus all --add-host=host.docker.internal:host-gateway -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:cuda + ``` + +### Installation for OpenAI API Usage Only + +- **If you're only using OpenAI API**, use this command: + + ```bash + docker run -d -p 3000:8080 -e OPENAI_API_KEY=your_secret_key -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:main + ``` + +### Installing Open WebUI with Bundled Ollama Support + +This installation method uses a single container image that bundles Open WebUI with Ollama, allowing for a streamlined setup via a single command. Choose the appropriate command based on your hardware setup: + +- **With GPU Support**: + Utilize GPU resources by running the following command: + + ```bash + docker run -d -p 3000:8080 --gpus=all -v ollama:/root/.ollama -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama + ``` + +- **For CPU Only**: + If you're not using a GPU, use this command instead: + + ```bash + docker run -d -p 3000:8080 -v ollama:/root/.ollama -v open-webui:/app/backend/data --name open-webui --restart always ghcr.io/open-webui/open-webui:ollama + ``` + +Both commands facilitate a built-in, hassle-free installation of both Open WebUI and Ollama, ensuring that you can get everything up and running swiftly. + +After installation, you can access Open WebUI at [http://localhost:3000](http://localhost:3000). Enjoy! 😄 + +### Other Installation Methods + +We offer various installation alternatives, including non-Docker native installation methods, Docker Compose, Kustomize, and Helm. Visit our [Open WebUI Documentation](https://docs.openwebui.com/getting-started/) or join our [Discord community](https://discord.gg/5rJgQTnV4s) for comprehensive guidance. + +### Troubleshooting + +Encountering connection issues? Our [Open WebUI Documentation](https://docs.openwebui.com/troubleshooting/) has got you covered. For further assistance and to join our vibrant community, visit the [Open WebUI Discord](https://discord.gg/5rJgQTnV4s). + +#### Open WebUI: Server Connection Error + +If you're experiencing connection issues, it’s often due to the WebUI docker container not being able to reach the Ollama server at 127.0.0.1:11434 (host.docker.internal:11434) inside the container . Use the `--network=host` flag in your docker command to resolve this. Note that the port changes from 3000 to 8080, resulting in the link: `http://localhost:8080`. + +**Example Docker Command**: + +```bash +docker run -d --network=host -v open-webui:/app/backend/data -e OLLAMA_BASE_URL=http://127.0.0.1:11434 --name open-webui --restart always ghcr.io/open-webui/open-webui:main +``` + +### Keeping Your Docker Installation Up-to-Date + +In case you want to update your local Docker installation to the latest version, you can do it with [Watchtower](https://containrrr.dev/watchtower/): + +```bash +docker run --rm --volume /var/run/docker.sock:/var/run/docker.sock containrrr/watchtower --run-once open-webui +``` + +In the last part of the command, replace `open-webui` with your container name if it is different. + +Check our Migration Guide available in our [Open WebUI Documentation](https://docs.openwebui.com/migration/). + +### Using the Dev Branch 🌙 + +> [!WARNING] +> The `:dev` branch contains the latest unstable features and changes. Use it at your own risk as it may have bugs or incomplete features. + +If you want to try out the latest bleeding-edge features and are okay with occasional instability, you can use the `:dev` tag like this: + +```bash +docker run -d -p 3000:8080 -v open-webui:/app/backend/data --name open-webui --add-host=host.docker.internal:host-gateway --restart always ghcr.io/open-webui/open-webui:dev +``` + +## What's Next? 🌟 + +Discover upcoming features on our roadmap in the [Open WebUI Documentation](https://docs.openwebui.com/roadmap/). + +## Supporters ✨ + +A big shoutout to our amazing supporters who's helping to make this project possible! 🙏 + +### Platinum Sponsors 🤍 + +- We're looking for Sponsors! + +### Acknowledgments + +Special thanks to [Prof. Lawrence Kim](https://www.lhkim.com/) and [Prof. Nick Vincent](https://www.nickmvincent.com/) for their invaluable support and guidance in shaping this project into a research endeavor. Grateful for your mentorship throughout the journey! 🙌 + +## License 📜 + +This project is licensed under the [MIT License](LICENSE) - see the [LICENSE](LICENSE) file for details. 📄 + +## Support 💬 + +If you have any questions, suggestions, or need assistance, please open an issue or join our +[Open WebUI Discord community](https://discord.gg/5rJgQTnV4s) to connect with us! 🤝 + +## Star History + + + + + + Star History Chart + + + +--- + +Created by [Timothy J. Baek](https://github.com/tjbck) - Let's make Open WebUI even more amazing together! 💪 diff --git a/1_infrastructure/docker/docker_open_webui/docker-compose.yaml b/1_infrastructure/docker/docker_open_webui/docker-compose.yaml new file mode 100644 index 0000000000000000000000000000000000000000..fdb6c6ded022b9545ea6edf235a751cc09c86e1b --- /dev/null +++ b/1_infrastructure/docker/docker_open_webui/docker-compose.yaml @@ -0,0 +1,64 @@ +version: '3' + +services: + ollama: + volumes: + - ollama:/root/.ollama + container_name: ollama + pull_policy: always + tty: true + restart: unless-stopped + image: ollama/ollama:${OLLAMA_DOCKER_TAG-latest} + command: sh -c "ollama pull qwq:32b && ollama serve" + ports: + - 11434:11434 + deploy: + resources: + reservations: + devices: + - driver: nvidia + capabilities: ["gpu"] + count: 4 + + open-webui: + build: + context: . + args: + OLLAMA_BASE_URL: '/ollama' + dockerfile: Dockerfile + image: ghcr.io/open-webui/open-webui:${WEBUI_DOCKER_TAG-main} + container_name: open-webui + volumes: + - open-webui:/app/backend/data + depends_on: + - ollama + ports: + - ${OPEN_WEBUI_PORT-9000}:8080 + environment: + - 'OLLAMA_BASE_URL=http://ollama:11434' # localhost 대신 ollama 사용 + - 'WEBUI_SECRET_KEY=' + extra_hosts: + - host.docker.internal:host-gateway + restart: unless-stopped + + openmanus: + build: + context: . + dockerfile: Dockerfile.openmanus + container_name: openmanus + depends_on: + - ollama + deploy: + resources: + reservations: + devices: + - driver: nvidia + capabilities: ["gpu"] + count: 4 + tty: true + stdin_open: true + restart: unless-stopped + +volumes: + ollama: {} + open-webui: {} diff --git a/docker/docker_posivibes/Dockerfile b/1_infrastructure/docker/docker_posivibes/Dockerfile similarity index 100% rename from docker/docker_posivibes/Dockerfile rename to 1_infrastructure/docker/docker_posivibes/Dockerfile diff --git a/docker/docker_posivibes/README.md b/1_infrastructure/docker/docker_posivibes/README.md similarity index 100% rename from docker/docker_posivibes/README.md rename to 1_infrastructure/docker/docker_posivibes/README.md diff --git a/docker/docker_posivibes/docker-compose.yml b/1_infrastructure/docker/docker_posivibes/docker-compose.yml similarity index 100% rename from docker/docker_posivibes/docker-compose.yml rename to 1_infrastructure/docker/docker_posivibes/docker-compose.yml diff --git a/docker/docker_posivibes/rebuild_docker.sh b/1_infrastructure/docker/docker_posivibes/rebuild_docker.sh similarity index 100% rename from docker/docker_posivibes/rebuild_docker.sh rename to 1_infrastructure/docker/docker_posivibes/rebuild_docker.sh diff --git a/docker/docker_posivibes/start_service.sh b/1_infrastructure/docker/docker_posivibes/start_service.sh similarity index 100% rename from docker/docker_posivibes/start_service.sh rename to 1_infrastructure/docker/docker_posivibes/start_service.sh diff --git a/1_infrastructure/docker/docker_prusa_exporter/.gitignore b/1_infrastructure/docker/docker_prusa_exporter/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e660fd93d3196215552065b1e63bf6a2f393ed86 --- /dev/null +++ b/1_infrastructure/docker/docker_prusa_exporter/.gitignore @@ -0,0 +1 @@ +bin/ diff --git a/1_infrastructure/docker/docker_prusa_exporter/Dockerfile b/1_infrastructure/docker/docker_prusa_exporter/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..67a5a483e272ef47049ecbbc724b0e67c6aa6381 --- /dev/null +++ b/1_infrastructure/docker/docker_prusa_exporter/Dockerfile @@ -0,0 +1,22 @@ +# syntax=docker/dockerfile:1 + +FROM golang:1.21-alpine AS builder + +WORKDIR /app + +COPY go.* ./ +RUN go mod download + +COPY . ./ + +COPY *.go ./ + +RUN go build -v -o /prusa_exporter + +FROM alpine:latest + +COPY --from=builder /prusa_exporter . + +EXPOSE 10009 + +ENTRYPOINT ["/prusa_exporter"] \ No newline at end of file diff --git a/1_infrastructure/docker/docker_prusa_exporter/README.md b/1_infrastructure/docker/docker_prusa_exporter/README.md new file mode 100644 index 0000000000000000000000000000000000000000..031d8fda7983741b7ce479024457dc3e803ba51d --- /dev/null +++ b/1_infrastructure/docker/docker_prusa_exporter/README.md @@ -0,0 +1,129 @@ +[![docker](https://img.shields.io/github/actions/workflow/status/pstrobl96/prusa_exporter/docker.yml)](https://github.com/pstrobl96/prusa_exporter/actions/workflows/docker.yml) +[![rpi](https://img.shields.io/github/actions/workflow/status/pstrobl96/prusa_exporter/rpi.yml)](https://github.com/pstrobl96/prusa_exporter/actions/workflows/rpi.yml) +![issues](https://img.shields.io/github/issues/pstrobl96/prusa_exporter) +![go](https://img.shields.io/github/go-mod/go-version/pstrobl96/prusa_exporter) +![tag](https://img.shields.io/github/v/tag/pstrobl96/prusa_exporter) +![license](https://img.shields.io/github/license/pstrobl96/prusa_exporter) + +# Prusa Exporter - formerly Buddy Link Prometheus Exporter + +This is an implementation of Prometheus Exporter for Prusa printers running Buddy boards (Prusa MK4, XL, and Mini), Einsy boards (Prusa MK3(S(+)) with Prusa Link installed) or resin printers (SL1). Multi-target is supported out of the box so you can check any number of printers as long it has accessible Prusa Link API and you have enough computing power. + +For MK3S with Einsy board you need to use at least version 0.7.0 of Prusa Link or higher, because there are many more metrics to scrape than in the older versions. You can find the most up to date version in the [Prusa Link repository](https://github.com/prusa3d/Prusa-Link/releases). + +- [Prusa Exporter - formerly Buddy Link Prometheus Exporter](#prusa-exporter---formerly-buddy-link-prometheus-exporter) + - [Where to find prusa exporter](#where-to-find-prusa-exporter) + - [Roadmap](#roadmap) + - [How to install prusa exporter](#how-to-install-prusa-exporter) + - [Git Clone](#git-clone) + - [Docker Compose](#docker-compose) + - [Logs](#logs) + - [Metrics](#metrics) + - [Raspberry Pi](#raspberry-pi) + - [Starting](#starting) + - [Grafana Dashboards](#grafana-dashboards) + - [Prusa Link](#prusa-link) + - [Syslog](#syslog) + - [Overview](#overview) + +## Where to find prusa exporter + +Prusa exporter runs on port 10009, but you can choose different port in `prusa.yml`. Metrics are accessible at `/metrics` endpoint. + +## Roadmap + +This list contains current and future features along with completion status: + +- [x] Scrape of metrics from [Prusa Link](https://github.com/prusa3d/Prusa-Link/tree/0.7.0rc3) +- [x] Use of Grafana Cloud +- [x] CI pipeline with Docker Hub publish +- [x] Local instance of Grafana / Prometheus / Loki +- [x] Raspberry Pi Image +- [ ] Support for [connection](#21) to Einsy with username and password +- [x] Support for MK3 - it was implemented before but I want overhaul it and make it work +- [x] Dashboard update +- [x] Configuration update +- [x] Send logs to Grafana Cloud +- [x] Enable node_exporter for Grafana Cloud +- [x] Optimize and get more syslog metrics +- [ ] Automatically send syslog config gcode to buddy boards +- [ ] exporter toolkit implemenation +- [ ] Create endpoint for configuration update +- [ ] Unit tests +- [ ] Create systemd service for exporter and install script +- [ ] Properly provision on premise setup +- [ ] CI for binaries release +- [x] Enable log collection to Loki +- [x] SL1 support + +## How to install prusa exporter + +### Git Clone + +First things first. You need to clone the repo and that which is very easy, right? + +`git clone https://github.com/pstrobl96/prusa_exporter.git` + +### Docker Compose + +I've created docker-compose.yaml file, that can be used for deploy of exporter. You would need [Docker](https://docs.docker.com/engine/install/) and [docker-compose](https://docs.docker.com/compose/install/linux/) plugin installed. Right now it is possible to use `docker compose up` or if you want to try newest codebase, then just run `sudo docker compose -f docker-compose.testing.yaml up --build --force-recreate` that will build new docker image of exporter with Grafana Agent. + +### Logs + +Printer logs and detailed metrics are sent via Syslog which is not best option but it is what it is. However to get data to Loki I need to process logs in exporter. I wanted to use Promtail for forwarding the logs to Loki however I was not successful with this approach because Promtail was throwing EOL errors so I forward logs into file in exporter and I configured Promtail to scrape and parse them. You can find how to configure logs in [config.md](docs/config.md) and [exporter.md](docs/exporter.md) + +### Metrics + +Metrics that you can find in this exporter are "scraped" from two sources. First is Prusa Link, it is pretty usual REST API that returns all data in JSON. There is a lot of useful metrics but there are few that are missing. Like data from most of sensors and for example current or voltage. However this is not applicable to **Einsy printers like MK3, these supports only Prusa Link API. As well as resin printers like SL1.** You can find how to configure metrics in [config.md](docs/config.md) and [exporter.md](docs/exporter.md) + +For Buddy - SYSLOG exists. [Syslog](https://en.wikipedia.org/wiki/Syslog) is standard for logging for a quite while however printer used it for sending metrics. Trough UDP. So what I just did is that I created experimental Syslog UDP server within this exporter and I'm catching these "metrics". **Be aware that these metrics can be send only via wired ethernet. You are out of luck over the air.** + +**The issue is that if you have more printers you'll create a lot of UDP traffic in the network.** If you have more printers this number multiplies. I choose flag this feature experimental because you cannot be sure you'll get the metrics, it's UDP and printers are sending data as much as they can but it is not consistent. Between printers there are differences - obvisouly. + +Example how metrics looks can be found in ![this](docs/examples/metrics_example.md) file. This file also includes Einsy and Buddy syslog metrics. + +How to config Syslog metrics you can find in ![documentation](docs/syslog.md). + +### Raspberry Pi + +I also created Raspberry Pi image that can be flashed to memory card. If you choose this path you'll need following. + +- Raspberry Pi (*4 and 5 tested*) with 64 bit support +- At least *Class 10* and at least *16 gigs* Memory card - preferably some kind of durable one + +Of course all other accessories like computer, card reader, power supply etc. are mandatory. How to flash Raspberry Pi image you can find in ![documentation](docs/rpi_image.md) + +### Starting + +Starting of exporter is simple. Just change directory to where docker-compose.yaml and configs are and run following command. + +``` +docker compose up + +``` + +:tada: if everthing went alright your instance is up and running and you can find metrics at [/metrics](http://localhost:10009/metrics) endpoint. + +## Grafana Dashboards + +I also prepared one dashboard per board which you can find in the [docs/examples/grafana](docs/examples/grafana) folder. + +### Prusa Link + +Download this dashboard straight from [Grafana.net](https://grafana.com/grafana/dashboards/20393)! Just use ID `20393` when importing. + +![dashboard](docs/examples/grafana/prusalink.png) + +### Syslog + +Download this dashboard straight from [Grafana.net](https://grafana.com/grafana/dashboards/20618)! Just use ID `20618` when importing. + +![dashboard](docs/examples/grafana/syslog.png) + +### Overview + +This dashboard is used for monitoring all of your printers. Basically - green means printing, blue means ready, yellow means warning and red is error. You need [polystat panel](https://github.com/grafana/grafana-polystat-panel) for this dashboard. + +Download this dashboard straight from [Grafana.net](https://grafana.com/grafana/dashboards/20449)! Just use ID `20449` when importing. + +![dashboard](docs/examples/grafana/overview.png) \ No newline at end of file diff --git a/1_infrastructure/docker/docker_prusa_exporter/docker-compose.yaml b/1_infrastructure/docker/docker_prusa_exporter/docker-compose.yaml new file mode 100644 index 0000000000000000000000000000000000000000..bec73cc487916f5ddd8c33c06959a53f1238e1a1 --- /dev/null +++ b/1_infrastructure/docker/docker_prusa_exporter/docker-compose.yaml @@ -0,0 +1,89 @@ +version: "3" + +networks: + prusa: + +volumes: + mimir_data: + grafana_data: + prusa_syslog_logs: + +services: + loki: + image: grafana/loki:2.9.6 + container_name: loki + restart: unless-stopped + volumes: + - ./docs/examples/config/on_premise/loki.yaml:/etc/loki/local-config.yaml + command: -config.file=/etc/loki/local-config.yaml + networks: + - prusa + + mimir: + image: grafana/mimir:2.11.0 + container_name: mimir + restart: unless-stopped + volumes: + - ./docs/examples/config/on_premise/mimir.yaml:/etc/mimir-config/mimir.yaml + - mimir_data:/data + entrypoint: + - /bin/mimir + - -config.file=/etc/mimir-config/mimir.yaml + networks: + - prusa + + grafana: + image: grafana/grafana:10.4.1 + container_name: grafana + restart: unless-stopped + environment: + - GF_INSTALL_PLUGINS=grafana-xyzchart-panel, grafana-polystat-panel + depends_on: + - loki + - mimir + ports: + - "3000:3000" + networks: + - prusa + volumes: + - ./docs/examples/config/grafana/provisioning:/etc/grafana/provisioning + - grafana_data:/var/lib/grafana + - ./docs/examples/grafana/provisioning:/var/lib/grafana/dashboards + + exporter: + image: pubeldev/prusa_exporter:v1.0.rc2 + container_name: exporter + restart: unless-stopped + volumes: + - prusa_syslog_logs:/var/log/prusa + - type: bind + source: ./docs/examples/config/common/prusa.yml + target: /app/prusa.yml + ports: + - "10007:10007/udp" + - "10008:10008/udp" + - "10009:10009" + command: '--config.file=/app/prusa.yml' + networks: + - prusa + + agent: + image: grafana/agent:v0.40.3 + container_name: agent + depends_on: + - exporter + - mimir + restart: unless-stopped + volumes: + - /var/run/docker.sock:/var/run/docker.sock + - prusa_syslog_logs:/var/log/prusa + - type: bind + source: ./docs/examples/config/on_premise/agent.yaml + target: /etc/agent-config/agent.yaml + entrypoint: + - /bin/grafana-agent + - -server.http.address=0.0.0.0:12345 + - -config.file=/etc/agent-config/agent.yaml + - -metrics.wal-directory=/tmp/agent/wal + networks: + - prusa \ No newline at end of file diff --git a/docker/docker_registry/README.md b/1_infrastructure/docker/docker_registry/README.md similarity index 100% rename from docker/docker_registry/README.md rename to 1_infrastructure/docker/docker_registry/README.md diff --git a/docker/docker_registry/docker-compose.yml b/1_infrastructure/docker/docker_registry/docker-compose.yml similarity index 100% rename from docker/docker_registry/docker-compose.yml rename to 1_infrastructure/docker/docker_registry/docker-compose.yml diff --git a/docker/docker_securedb/Dockerfile b/1_infrastructure/docker/docker_securedb/Dockerfile similarity index 100% rename from docker/docker_securedb/Dockerfile rename to 1_infrastructure/docker/docker_securedb/Dockerfile diff --git a/docker/docker_securedb/README.md b/1_infrastructure/docker/docker_securedb/README.md similarity index 100% rename from docker/docker_securedb/README.md rename to 1_infrastructure/docker/docker_securedb/README.md diff --git a/docker/docker_securedb/docker-compose.yml b/1_infrastructure/docker/docker_securedb/docker-compose.yml similarity index 100% rename from docker/docker_securedb/docker-compose.yml rename to 1_infrastructure/docker/docker_securedb/docker-compose.yml diff --git a/docker/docker_securedb/rebuild_docker.sh b/1_infrastructure/docker/docker_securedb/rebuild_docker.sh similarity index 100% rename from docker/docker_securedb/rebuild_docker.sh rename to 1_infrastructure/docker/docker_securedb/rebuild_docker.sh diff --git a/docker/docker_securedb/start_service.sh b/1_infrastructure/docker/docker_securedb/start_service.sh similarity index 100% rename from docker/docker_securedb/start_service.sh rename to 1_infrastructure/docker/docker_securedb/start_service.sh diff --git a/docker/docker_ssl_setup_guide.md b/1_infrastructure/docker/docker_ssl_setup_guide.md similarity index 100% rename from docker/docker_ssl_setup_guide.md rename to 1_infrastructure/docker/docker_ssl_setup_guide.md diff --git a/docker/docker_ubuntu_ssh/Dockerfile b/1_infrastructure/docker/docker_ubuntu_ssh/Dockerfile similarity index 100% rename from docker/docker_ubuntu_ssh/Dockerfile rename to 1_infrastructure/docker/docker_ubuntu_ssh/Dockerfile diff --git a/docker/docker_ubuntu_ssh/README.md b/1_infrastructure/docker/docker_ubuntu_ssh/README.md similarity index 100% rename from docker/docker_ubuntu_ssh/README.md rename to 1_infrastructure/docker/docker_ubuntu_ssh/README.md diff --git a/docker/docker_ubuntu_ssh/docker-compose.yml b/1_infrastructure/docker/docker_ubuntu_ssh/docker-compose.yml similarity index 100% rename from docker/docker_ubuntu_ssh/docker-compose.yml rename to 1_infrastructure/docker/docker_ubuntu_ssh/docker-compose.yml diff --git a/docker/docker_ubuntu_ssh/rebuild_docker.sh b/1_infrastructure/docker/docker_ubuntu_ssh/rebuild_docker.sh similarity index 100% rename from docker/docker_ubuntu_ssh/rebuild_docker.sh rename to 1_infrastructure/docker/docker_ubuntu_ssh/rebuild_docker.sh diff --git a/docker/docker_vnexa_api/Dockerfile b/1_infrastructure/docker/docker_vnexa_api/Dockerfile similarity index 100% rename from docker/docker_vnexa_api/Dockerfile rename to 1_infrastructure/docker/docker_vnexa_api/Dockerfile diff --git a/docker/docker_vnexa_api/README.md b/1_infrastructure/docker/docker_vnexa_api/README.md similarity index 100% rename from docker/docker_vnexa_api/README.md rename to 1_infrastructure/docker/docker_vnexa_api/README.md diff --git a/docker/docker_vnexa_api/app/app.py b/1_infrastructure/docker/docker_vnexa_api/app/app.py similarity index 100% rename from docker/docker_vnexa_api/app/app.py rename to 1_infrastructure/docker/docker_vnexa_api/app/app.py diff --git a/docker/docker_vnexa_api/app/requirements.txt b/1_infrastructure/docker/docker_vnexa_api/app/requirements.txt similarity index 100% rename from docker/docker_vnexa_api/app/requirements.txt rename to 1_infrastructure/docker/docker_vnexa_api/app/requirements.txt diff --git a/docker/docker_vnexa_api/docker-compose.yml b/1_infrastructure/docker/docker_vnexa_api/docker-compose.yml similarity index 100% rename from docker/docker_vnexa_api/docker-compose.yml rename to 1_infrastructure/docker/docker_vnexa_api/docker-compose.yml diff --git a/docker/docker_vnexa_api/rebuild_docker.sh b/1_infrastructure/docker/docker_vnexa_api/rebuild_docker.sh similarity index 100% rename from docker/docker_vnexa_api/rebuild_docker.sh rename to 1_infrastructure/docker/docker_vnexa_api/rebuild_docker.sh diff --git a/docker/docker_was/Dockerfile b/1_infrastructure/docker/docker_was/Dockerfile similarity index 100% rename from docker/docker_was/Dockerfile rename to 1_infrastructure/docker/docker_was/Dockerfile diff --git a/docker/docker_was/README.md b/1_infrastructure/docker/docker_was/README.md similarity index 100% rename from docker/docker_was/README.md rename to 1_infrastructure/docker/docker_was/README.md diff --git a/docker/docker_was/docker-compose.yml b/1_infrastructure/docker/docker_was/docker-compose.yml similarity index 100% rename from docker/docker_was/docker-compose.yml rename to 1_infrastructure/docker/docker_was/docker-compose.yml diff --git a/docker/docker_was/rebuild_docker.sh b/1_infrastructure/docker/docker_was/rebuild_docker.sh similarity index 100% rename from docker/docker_was/rebuild_docker.sh rename to 1_infrastructure/docker/docker_was/rebuild_docker.sh diff --git a/docker/docker_was/setting.sql b/1_infrastructure/docker/docker_was/setting.sql similarity index 100% rename from docker/docker_was/setting.sql rename to 1_infrastructure/docker/docker_was/setting.sql diff --git a/docker/docker_was/start_service.sh b/1_infrastructure/docker/docker_was/start_service.sh similarity index 100% rename from docker/docker_was/start_service.sh rename to 1_infrastructure/docker/docker_was/start_service.sh diff --git a/docker/docker_was_upgrade/Dockerfile b/1_infrastructure/docker/docker_was_upgrade/Dockerfile similarity index 100% rename from docker/docker_was_upgrade/Dockerfile rename to 1_infrastructure/docker/docker_was_upgrade/Dockerfile diff --git a/docker/docker_was_upgrade/README.md b/1_infrastructure/docker/docker_was_upgrade/README.md similarity index 100% rename from docker/docker_was_upgrade/README.md rename to 1_infrastructure/docker/docker_was_upgrade/README.md diff --git a/docker/docker_was_upgrade/docker-compose.yml b/1_infrastructure/docker/docker_was_upgrade/docker-compose.yml similarity index 100% rename from docker/docker_was_upgrade/docker-compose.yml rename to 1_infrastructure/docker/docker_was_upgrade/docker-compose.yml diff --git a/docker/docker_was_upgrade/rebuild_docker.sh b/1_infrastructure/docker/docker_was_upgrade/rebuild_docker.sh similarity index 100% rename from docker/docker_was_upgrade/rebuild_docker.sh rename to 1_infrastructure/docker/docker_was_upgrade/rebuild_docker.sh diff --git a/docker/docker_was_upgrade/setting.sql b/1_infrastructure/docker/docker_was_upgrade/setting.sql similarity index 100% rename from docker/docker_was_upgrade/setting.sql rename to 1_infrastructure/docker/docker_was_upgrade/setting.sql diff --git a/docker/docker_was_upgrade/start_service.sh b/1_infrastructure/docker/docker_was_upgrade/start_service.sh similarity index 100% rename from docker/docker_was_upgrade/start_service.sh rename to 1_infrastructure/docker/docker_was_upgrade/start_service.sh diff --git a/docker/docker_was_upgrade_http/Dockerfile b/1_infrastructure/docker/docker_was_upgrade_http/Dockerfile similarity index 100% rename from docker/docker_was_upgrade_http/Dockerfile rename to 1_infrastructure/docker/docker_was_upgrade_http/Dockerfile diff --git a/docker/docker_was_upgrade_http/README.md b/1_infrastructure/docker/docker_was_upgrade_http/README.md similarity index 100% rename from docker/docker_was_upgrade_http/README.md rename to 1_infrastructure/docker/docker_was_upgrade_http/README.md diff --git a/docker/docker_was_upgrade_http/docker-compose.yml b/1_infrastructure/docker/docker_was_upgrade_http/docker-compose.yml similarity index 100% rename from docker/docker_was_upgrade_http/docker-compose.yml rename to 1_infrastructure/docker/docker_was_upgrade_http/docker-compose.yml diff --git a/docker/docker_was_upgrade_http/rebuild_docker.sh b/1_infrastructure/docker/docker_was_upgrade_http/rebuild_docker.sh similarity index 100% rename from docker/docker_was_upgrade_http/rebuild_docker.sh rename to 1_infrastructure/docker/docker_was_upgrade_http/rebuild_docker.sh diff --git a/docker/docker_was_upgrade_http/setting.sql b/1_infrastructure/docker/docker_was_upgrade_http/setting.sql similarity index 100% rename from docker/docker_was_upgrade_http/setting.sql rename to 1_infrastructure/docker/docker_was_upgrade_http/setting.sql diff --git a/docker/docker_was_upgrade_http/start_service.sh b/1_infrastructure/docker/docker_was_upgrade_http/start_service.sh similarity index 100% rename from docker/docker_was_upgrade_http/start_service.sh rename to 1_infrastructure/docker/docker_was_upgrade_http/start_service.sh diff --git a/docker/examples/.gitkeep b/1_infrastructure/docker/examples/.gitkeep similarity index 100% rename from docker/examples/.gitkeep rename to 1_infrastructure/docker/examples/.gitkeep diff --git a/docker/examples/Dockerfile b/1_infrastructure/docker/examples/Dockerfile similarity index 100% rename from docker/examples/Dockerfile rename to 1_infrastructure/docker/examples/Dockerfile diff --git a/docker/examples/README.md b/1_infrastructure/docker/examples/README.md similarity index 100% rename from docker/examples/README.md rename to 1_infrastructure/docker/examples/README.md diff --git a/docker/examples/docker-compose.yml b/1_infrastructure/docker/examples/docker-compose.yml similarity index 100% rename from docker/examples/docker-compose.yml rename to 1_infrastructure/docker/examples/docker-compose.yml diff --git a/docker/examples/rebuild_docker.sh b/1_infrastructure/docker/examples/rebuild_docker.sh similarity index 100% rename from docker/examples/rebuild_docker.sh rename to 1_infrastructure/docker/examples/rebuild_docker.sh diff --git a/docker/examples/start_service.sh b/1_infrastructure/docker/examples/start_service.sh similarity index 100% rename from docker/examples/start_service.sh rename to 1_infrastructure/docker/examples/start_service.sh diff --git a/1_infrastructure/docker/geumdo-rag-chat-bot/.gitignore b/1_infrastructure/docker/geumdo-rag-chat-bot/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..87d6a6a4acdaf1f7d132756bc0ef78ae49cf39bc --- /dev/null +++ b/1_infrastructure/docker/geumdo-rag-chat-bot/.gitignore @@ -0,0 +1,40 @@ +# Python +__pycache__/ +*.pyc +*.pyo +*.pyd +.Python +env/ +venv/ +.venv/ +pip-log.txt +pip-delete-this-directory.txt +.eggs/ +*.egg-info/ +dist/ +build/ + +# IDEs and editors +.idea/ +.vscode/ +*.swp +*.swo + +# Secrets +.env +.env.* + +# RAG Project Specific +# Cloned GitLab repositories +/cloned_repos/ +# FAISS vector store index +/faiss_gitlab_code_index/ + +# OS specific +.DS_Store +Thumbs.db + +# Test artifacts +.pytest_cache/ +htmlcov/ +.coverage \ No newline at end of file diff --git a/1_infrastructure/docker/geumdo-rag-chat-bot/Dockerfile b/1_infrastructure/docker/geumdo-rag-chat-bot/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..2cf6076b97f44cad0d67876a7f25769a4aaf06ee --- /dev/null +++ b/1_infrastructure/docker/geumdo-rag-chat-bot/Dockerfile @@ -0,0 +1,32 @@ +# 1. Base Image +FROM python:3.10-slim + +# 2. Set environment variables +ENV PYTHONDONTWRITEBYTECODE 1 +ENV PYTHONUNBUFFERED 1 +ENV POETRY_NO_INTERACTION=1 \ + POETRY_VIRTUALENVS_CREATE=false + +# 3. Set working directory +WORKDIR /app + +# 4. Install poetry +RUN pip install --no-cache-dir poetry + +# 5. Copy dependency definition files +COPY pyproject.toml ./ + +# 6. Install dependencies +# Using --no-cache-dir to keep the image size down +RUN poetry install --no-root --no-interaction --no-ansi + +# 7. Copy application code +COPY . . + +# 8. Expose port for streamlit +EXPOSE 8501 + +# 9. Command to run the app +# The command is overridden in docker-compose.yml for development, +# but this serves as a good default. +CMD ["streamlit", "run", "ui_poc.py"] \ No newline at end of file diff --git a/1_infrastructure/docker/geumdo-rag-chat-bot/README.md b/1_infrastructure/docker/geumdo-rag-chat-bot/README.md new file mode 100644 index 0000000000000000000000000000000000000000..75f1a91583857f744c7d6757c37c3728e699493f --- /dev/null +++ b/1_infrastructure/docker/geumdo-rag-chat-bot/README.md @@ -0,0 +1,265 @@ +# RAG 기반 사내 코드 검색 챗봇 + +본 프로젝트는 Retrieval-Augmented Generation (RAG) 아키텍처를 기반으로, 사내 GitLab 코드 리포지토리에 대해 자연어 질의를 수행할 수 있는 챗봇입니다. + +## 기술 아키텍처 + +프로젝트는 `docker-compose.yml`을 통해 관리되는 4개의 주요 Docker 컨테이너로 구성됩니다. + +1. **`ui` (프론트엔드)**: + - **프레임워크**: Streamlit + - **역할**: 채팅 형태의 사용자 인터페이스를 제공합니다. 사용자의 모든 질문과 상호작용은 이 서비스를 통해 이루어지며, 백엔드 `api`와 통신합니다. + +2. **`api` (백엔드)**: + - **프레임워크**: FastAPI + - **역할**: QA 로직의 핵심을 담당합니다. RAG 파이프라인을 실행하고 REST API 엔드포인트를 통해 제공합니다. + - `POST /query`: `ui`로부터 질문을 받아 RAG 파이프라인으로 처리한 후, 답변과 참고 문서를 반환합니다. + - `POST /feedback`: 성능 평가를 위해 사용자의 피드백(좋아요/싫어요)을 수집합니다. + - **RAG 파이프라인 (`qa.py`)**: + - **Retriever**: `EnsembleRetriever`를 사용하여 두 가지 검색 방식을 결합하여 검색 정확도를 극대화합니다. + 1. **Semantic Search**: `Chroma`를 벡터 스토어로 사용하는 `SelfQueryRetriever`. LLM을 활용하여 사용자의 자연어 질문을 메타데이터 필터링(예: `project_name`, `language`)이 포함된 벡터 쿼리로 변환합니다. + 2. **Lexical Search**: 키워드 기반 검색을 위한 `BM25Retriever`. + - **Generator**: `ChatOpenAI` (기본값 `gpt-4o`)를 사용하여 검색된 문서를 기반으로 답변을 생성하며, 출처를 명시하도록 설계되었습니다. + +3. **`indexing` (데이터 파이프라인)**: + - **프레임워크**: `apscheduler`를 사용한 Python 스크립트 + - **역할**: 데이터 수집 및 전처리를 담당합니다. + - GitLab 리포지토리를 로컬 디렉토리(`cloned_repos`)에 동기화합니다. + - `LangChain`을 사용하여 소스 코드 파일(`.py`, `.java`, `.md` 등)을 처리합니다. + - OpenAI 임베딩 모델(`text-embedding-3-small`)을 사용하여 임베딩을 생성하고 `ChromaDB`에 저장합니다. + - 키워드 검색을 위한 `BM25` 인덱스를 생성하고 저장합니다. + - **스케줄**: 컨테이너 시작 시 즉시 실행된 후, 매일 자정에 다시 실행되어 데이터 최신성을 유지합니다. + +4. **`chroma` (벡터 데이터베이스)**: + - **이미지**: `chromadb/chroma` + - **역할**: `indexing` 서비스가 생성한 코드 벡터 임베딩을 저장합니다. 데이터는 `./chroma_data` 볼륨에 영속적으로 저장됩니다. + +## 기술 스택 + +- **백엔드**: FastAPI, Uvicorn +- **프론트엔드**: Streamlit +- **오케스트레이션**: Docker, Docker Compose +- **RAG/LLM 프레임워크**: LangChain, OpenAI +- **벡터 데이터베이스**: ChromaDB +- **검색**: BM25 (Lexical Search) +- **의존성 관리**: Poetry +- **작업 스케줄링**: APScheduler + +## 실행 방법 + +### 사전 요구사항 + +- Docker 및 Docker Compose +- GitLab 서버 접근 권한 +- OpenAI API 키 + +### 설정 + +1. **리포지토리 클론** (아직 수행하지 않은 경우). + +2. **`.env` 파일 생성**: `.env.example` 파일을 `.env`로 복사하거나 이름을 변경하고, 필요한 환경 변수를 채웁니다. + ```env + # OpenAI API 키 + OPENAI_API_KEY="sk-..." + + # GitLab 정보 + GITLAB_URL="https://gitlab.your-company.com" + GITLAB_PRIVATE_TOKEN="glpat-..." # 'read_api' 권한이 있는 토큰 + + # (선택) 모델 및 이름 커스터마이징 + LLM_MODEL="gpt-4o" + EMBEDDING_MODEL="text-embedding-3-small" + CHROMA_COLLECTION_NAME="gitlab_code_collection" + + # UI가 사용할 API 주소 + # Docker 호스트의 IP 또는 설정된 도메인 이름을 사용 + API_BASE_URL="http://localhost:8001" + ``` + +### 실행 + +1. **컨테이너 빌드 및 실행**: + ```bash + docker-compose up --build -d + ``` + +2. **초기 인덱싱**: + 최초 실행 시 `indexing` 서비스가 모든 GitLab 리포지토리를 클론하고 인덱싱을 시작합니다. 이 과정은 리포지토리의 수와 크기에 따라 상당한 시간이 소요될 수 있습니다. + 컨테이너 로그를 통해 진행 상황을 모니터링할 수 있습니다. + ```bash + docker-compose logs -f indexing + ``` + +3. **애플리케이션 접근**: + - **챗봇 UI**: 브라우저에서 `http://localhost:8501`로 접속합니다. + - **API (Swagger UI)**: `http://localhost:8001/docs`에서 확인할 수 있습니다. + +### 중지 + +모든 서비스를 중지하려면 다음을 실행합니다. +```bash +docker-compose down +``` + +## 🎯 프로젝트 목표 + +- **개발 생산성 향상**: 코드베이스 이해 시간 단축 및 원하는 정보 즉시 검색 +- **지식 관리 및 공유**: 시스템화된 코드 지식 기반 답변 제공 +- **신규 입사자 온보딩 가속화**: 새로운 프로젝트나 레거시 코드 이해도 향상 +- **코드 품질 유지**: 중복 개발 방지 및 기존 코드 재사용성 증대 + +## 🏗️ 시스템 아키텍처 + +```mermaid +graph TD + subgraph "Indexing Pipeline" + A[GitLab Repository] -->|Git Clone| B[로컬 코드/문서] + B -->|데이터 로드 및 파싱| C[소스코드, Markdown 등] + C -->|텍스트 분할| D[의미 단위 텍스트 조각] + D -->|임베딩 생성| E[벡터] + E -->|벡터 DB 저장| F[(ChromaDB)] + end + + subgraph "Retrieval & Generation Pipeline" + G[사용자 질문] -->|질문 임베딩| H[질문 벡터] + H -->|하이브리드 검색| F + F -->|관련 문서 검색| I[관련 코드/문서 조각] + G & I -->|프롬프트 구성| J[LLM 프롬프트] + J -->|답변 생성| K[GPT-4o] + K -->|최종 답변| L[생성된 답변] + end +``` + +## 🛠️ 기술 스택 + +### 핵심 기술 +- **언어**: Python 3.10+ +- **RAG 프레임워크**: LangChain +- **LLM**: OpenAI GPT-4o +- **임베딩**: OpenAI text-embedding-3-small +- **벡터 DB**: ChromaDB +- **검색**: 하이브리드 검색 (Self-Query + BM25) +- **재랭킹**: Cohere Rerank + +### 웹 인터페이스 +- **API 서버**: FastAPI + Uvicorn +- **웹 UI**: Streamlit +- **컨테이너화**: Docker + Docker Compose + +### Git 연동 +- **GitLab API**: python-gitlab +- **스케줄링**: APScheduler + +## 📁 프로젝트 구조 + +``` +사내코드검색봇/ +├── api.py # FastAPI 서버 (REST API) +├── indexing.py # GitLab 동기화 및 인덱싱 +├── qa.py # RAG 파이프라인 및 답변 생성 +├── ui.py # Streamlit 웹 인터페이스 +├── docker-compose.yml # Docker 서비스 구성 +├── Dockerfile # Docker 이미지 설정 +├── pyproject.toml # Python 의존성 관리 +├── RAG_Report.md # 상세 기술 보고서 +└── README.md # 프로젝트 문서 +``` + +## 🚀 빠른 시작 + +### 1. 환경 설정 + +1. **환경 변수 설정** + + `.env` 파일을 생성하고 다음 설정을 추가하세요: + + ```bash + # OpenAI API 설정 (필수) + OPENAI_API_KEY="your_openai_api_key_here" + + # GitLab 설정 (필수) + GITLAB_URL="http://gitlab.geumdo.net" + GITLAB_PRIVATE_TOKEN="your_gitlab_private_token_here" + + # Cohere API 설정 (선택사항 - 검색 결과 재랭킹용) + COHERE_API_KEY="your_cohere_api_key_here" + + # API 서버 설정 + API_BASE_URL="http://chat-bot.geumdo.net" + API_HOST="0.0.0.0" + API_PORT="8001" + + # ChromaDB 설정 + CHROMA_HOST="chroma" + CHROMA_PORT="8004" + CHROMA_COLLECTION_NAME="gitlab_code_collection" + + # LLM 모델 설정 + LLM_MODEL="gpt-4o" + EMBEDDING_MODEL="text-embedding-3-small" + + # 파일 경로 설정 + CLONE_DIR="cloned_repos" + BM25_INDEX_PATH="bm25_index.pkl" + ``` + + **필수 API 키 발급 방법:** + + - **OpenAI API 키**: [OpenAI Platform](https://platform.openai.com/api-keys)에서 발급 + - **GitLab Private Token**: GitLab → Settings → Access Tokens에서 `api` 스코프로 발급 + - **Cohere API 키** (선택): [Cohere Platform](https://cohere.ai/)에서 발급 + +2. **Docker Compose로 서비스 실행** + ```bash + docker-compose up -d + ``` + +### 2. 서비스 접속 + +- **웹 UI**: http://localhost:8501 +- **API 서버**: http://localhost:8001 +- **ChromaDB**: http://localhost:8004 + +### 3. 초기 인덱싱 + +첫 실행 시 GitLab 프로젝트 동기화 및 인덱싱이 자동으로 수행됩니다: + +```bash +# 수동으로 인덱싱 실행 (필요시) +docker-compose run indexing python indexing.py +``` + +## 🔧 주요 기능 + +### 1. 하이브리드 검색 +- **Self-Query Retriever**: 메타데이터 기반 필터링 (프로젝트명, 언어, 파일경로) +- **BM25 Retriever**: 키워드 기반 검색 +- **Ensemble Retriever**: 두 검색 결과를 가중 평균으로 결합 + +### 2. 고급 검색 기능 +- **메타데이터 필터링**: 프로젝트별, 언어별, 파일 경로별 검색 +- **재랭킹**: Cohere Rerank를 통한 검색 결과 품질 향상 +- **컨텍스트 보존**: 코드 구조를 유지하는 언어별 텍스트 분할 + +### 3. 사용자 인터페이스 +- **채팅형 인터페이스**: 자연스러운 대화형 질의응답 +- **피드백 시스템**: 답변 품질 개선을 위한 사용자 피드백 수집 +- **출처 표시**: 답변의 근거가 된 파일 경로 자동 표시 + +### 4. 자동화 +- **주기적 동기화**: GitLab 프로젝트 자동 업데이트 +- **증분 인덱싱**: 변경된 파일만 재인덱싱 +- **컨테이너화**: Docker를 통한 일관된 배포 환경 + +## 📖 사용 예시 + +### 질문 예시 +``` +"my-project에서 사용자 인증 관련 코드를 찾아줘" +"데이터베이스 연결 설정은 어디에 있어?" +"API 엔드포인트 구현 방법을 보여줘" +"특정 함수의 사용법을 알려줘" +``` + +### 답변 형식 +``` \ No newline at end of file diff --git a/1_infrastructure/docker/geumdo-rag-chat-bot/docker-compose.yml b/1_infrastructure/docker/geumdo-rag-chat-bot/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..fdb19ce40575d9d9da27e82fe3fff50d87b9e786 --- /dev/null +++ b/1_infrastructure/docker/geumdo-rag-chat-bot/docker-compose.yml @@ -0,0 +1,55 @@ +version: '3.8' + +services: + chroma: + image: chromadb/chroma + ports: + - "8004:8000" + volumes: + - ./chroma_data:/chroma/.chroma/index + # healthcheck: + # test: ["CMD", "curl", "-f", "http://localhost:8000/api/v1/heartbeat"] + # interval: 30s + # timeout: 10s + # retries: 5 + + indexing: + build: + context: . + dockerfile: Dockerfile + command: python indexing.py + volumes: + - .:/app + env_file: + - .env + depends_on: + - chroma + + api: + build: + context: . + dockerfile: Dockerfile + command: uvicorn api:app --host 0.0.0.0 --port 8001 --reload + ports: + - "8001:8001" + volumes: + - .:/app + env_file: + - .env + depends_on: + - chroma + - indexing + + ui: + build: + context: . + dockerfile: Dockerfile + command: streamlit run ui.py --server.port 8501 --server.address 0.0.0.0 + ports: + - "8501:8501" + volumes: + - .:/app + env_file: + - .env + depends_on: + - api \ No newline at end of file diff --git a/docker/geumdo_docker_report_240611.md b/1_infrastructure/docker/geumdo_docker_report_240611.md similarity index 100% rename from docker/geumdo_docker_report_240611.md rename to 1_infrastructure/docker/geumdo_docker_report_240611.md diff --git a/docker/gpu_cooling_monitor/.cursor/rules/clean-code.md b/1_infrastructure/docker/gpu_cooling_monitor/.cursor/rules/clean-code.md similarity index 100% rename from docker/gpu_cooling_monitor/.cursor/rules/clean-code.md rename to 1_infrastructure/docker/gpu_cooling_monitor/.cursor/rules/clean-code.md diff --git a/docker/gpu_cooling_monitor/.cursor/rules/global-rules.md b/1_infrastructure/docker/gpu_cooling_monitor/.cursor/rules/global-rules.md similarity index 100% rename from docker/gpu_cooling_monitor/.cursor/rules/global-rules.md rename to 1_infrastructure/docker/gpu_cooling_monitor/.cursor/rules/global-rules.md diff --git a/docker/gpu_cooling_monitor/.cursor/rules/user-guide.md b/1_infrastructure/docker/gpu_cooling_monitor/.cursor/rules/user-guide.md similarity index 100% rename from docker/gpu_cooling_monitor/.cursor/rules/user-guide.md rename to 1_infrastructure/docker/gpu_cooling_monitor/.cursor/rules/user-guide.md diff --git a/docker/gpu_cooling_monitor/Dockerfile b/1_infrastructure/docker/gpu_cooling_monitor/Dockerfile similarity index 100% rename from docker/gpu_cooling_monitor/Dockerfile rename to 1_infrastructure/docker/gpu_cooling_monitor/Dockerfile diff --git a/docker/gpu_cooling_monitor/README.md b/1_infrastructure/docker/gpu_cooling_monitor/README.md similarity index 100% rename from docker/gpu_cooling_monitor/README.md rename to 1_infrastructure/docker/gpu_cooling_monitor/README.md diff --git a/docker/gpu_cooling_monitor/check_system.py b/1_infrastructure/docker/gpu_cooling_monitor/check_system.py similarity index 100% rename from docker/gpu_cooling_monitor/check_system.py rename to 1_infrastructure/docker/gpu_cooling_monitor/check_system.py diff --git a/docker/gpu_cooling_monitor/docker-compose.yml b/1_infrastructure/docker/gpu_cooling_monitor/docker-compose.yml similarity index 100% rename from docker/gpu_cooling_monitor/docker-compose.yml rename to 1_infrastructure/docker/gpu_cooling_monitor/docker-compose.yml diff --git a/docker/gpu_cooling_monitor/grafana/provisioning/dashboards/dashboards.yml b/1_infrastructure/docker/gpu_cooling_monitor/grafana/provisioning/dashboards/dashboards.yml similarity index 100% rename from docker/gpu_cooling_monitor/grafana/provisioning/dashboards/dashboards.yml rename to 1_infrastructure/docker/gpu_cooling_monitor/grafana/provisioning/dashboards/dashboards.yml diff --git a/docker/gpu_cooling_monitor/grafana/provisioning/datasources/influxdb.yml b/1_infrastructure/docker/gpu_cooling_monitor/grafana/provisioning/datasources/influxdb.yml similarity index 100% rename from docker/gpu_cooling_monitor/grafana/provisioning/datasources/influxdb.yml rename to 1_infrastructure/docker/gpu_cooling_monitor/grafana/provisioning/datasources/influxdb.yml diff --git a/docker/gpu_cooling_monitor/requirement.md b/1_infrastructure/docker/gpu_cooling_monitor/requirement.md similarity index 100% rename from docker/gpu_cooling_monitor/requirement.md rename to 1_infrastructure/docker/gpu_cooling_monitor/requirement.md diff --git a/docker/gpu_cooling_monitor/requirements.txt b/1_infrastructure/docker/gpu_cooling_monitor/requirements.txt similarity index 100% rename from docker/gpu_cooling_monitor/requirements.txt rename to 1_infrastructure/docker/gpu_cooling_monitor/requirements.txt diff --git a/docker/gpu_cooling_monitor/sensors.conf b/1_infrastructure/docker/gpu_cooling_monitor/sensors.conf similarity index 100% rename from docker/gpu_cooling_monitor/sensors.conf rename to 1_infrastructure/docker/gpu_cooling_monitor/sensors.conf diff --git a/docker/gpu_cooling_monitor/src/__init__.py b/1_infrastructure/docker/gpu_cooling_monitor/src/__init__.py similarity index 100% rename from docker/gpu_cooling_monitor/src/__init__.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/__init__.py diff --git a/docker/gpu_cooling_monitor/src/api.py b/1_infrastructure/docker/gpu_cooling_monitor/src/api.py similarity index 100% rename from docker/gpu_cooling_monitor/src/api.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/api.py diff --git a/docker/gpu_cooling_monitor/src/config/__init__.py b/1_infrastructure/docker/gpu_cooling_monitor/src/config/__init__.py similarity index 100% rename from docker/gpu_cooling_monitor/src/config/__init__.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/config/__init__.py diff --git a/docker/gpu_cooling_monitor/src/config/config.py b/1_infrastructure/docker/gpu_cooling_monitor/src/config/config.py similarity index 100% rename from docker/gpu_cooling_monitor/src/config/config.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/config/config.py diff --git a/docker/gpu_cooling_monitor/src/cooling_monitor.py b/1_infrastructure/docker/gpu_cooling_monitor/src/cooling_monitor.py similarity index 100% rename from docker/gpu_cooling_monitor/src/cooling_monitor.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/cooling_monitor.py diff --git a/docker/gpu_cooling_monitor/src/implementation_plan.md b/1_infrastructure/docker/gpu_cooling_monitor/src/implementation_plan.md similarity index 100% rename from docker/gpu_cooling_monitor/src/implementation_plan.md rename to 1_infrastructure/docker/gpu_cooling_monitor/src/implementation_plan.md diff --git a/docker/gpu_cooling_monitor/src/main.py b/1_infrastructure/docker/gpu_cooling_monitor/src/main.py similarity index 100% rename from docker/gpu_cooling_monitor/src/main.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/main.py diff --git a/docker/gpu_cooling_monitor/src/monitors/__init__.py b/1_infrastructure/docker/gpu_cooling_monitor/src/monitors/__init__.py similarity index 100% rename from docker/gpu_cooling_monitor/src/monitors/__init__.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/monitors/__init__.py diff --git a/docker/gpu_cooling_monitor/src/monitors/cooling_monitor.py b/1_infrastructure/docker/gpu_cooling_monitor/src/monitors/cooling_monitor.py similarity index 100% rename from docker/gpu_cooling_monitor/src/monitors/cooling_monitor.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/monitors/cooling_monitor.py diff --git a/docker/gpu_cooling_monitor/src/monitors/gpu_monitor.py b/1_infrastructure/docker/gpu_cooling_monitor/src/monitors/gpu_monitor.py similarity index 100% rename from docker/gpu_cooling_monitor/src/monitors/gpu_monitor.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/monitors/gpu_monitor.py diff --git a/docker/gpu_cooling_monitor/src/notifications/__init__.py b/1_infrastructure/docker/gpu_cooling_monitor/src/notifications/__init__.py similarity index 100% rename from docker/gpu_cooling_monitor/src/notifications/__init__.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/notifications/__init__.py diff --git a/docker/gpu_cooling_monitor/src/notifications/alert_manager.py b/1_infrastructure/docker/gpu_cooling_monitor/src/notifications/alert_manager.py similarity index 100% rename from docker/gpu_cooling_monitor/src/notifications/alert_manager.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/notifications/alert_manager.py diff --git a/docker/gpu_cooling_monitor/src/notifications/slack_notifier.py b/1_infrastructure/docker/gpu_cooling_monitor/src/notifications/slack_notifier.py similarity index 100% rename from docker/gpu_cooling_monitor/src/notifications/slack_notifier.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/notifications/slack_notifier.py diff --git a/docker/gpu_cooling_monitor/src/utils/influxdb_client.py b/1_infrastructure/docker/gpu_cooling_monitor/src/utils/influxdb_client.py similarity index 100% rename from docker/gpu_cooling_monitor/src/utils/influxdb_client.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/utils/influxdb_client.py diff --git a/docker/gpu_cooling_monitor/src/utils/system_checker.py b/1_infrastructure/docker/gpu_cooling_monitor/src/utils/system_checker.py similarity index 100% rename from docker/gpu_cooling_monitor/src/utils/system_checker.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/utils/system_checker.py diff --git a/docker/gpu_cooling_monitor/src/web/app.py b/1_infrastructure/docker/gpu_cooling_monitor/src/web/app.py similarity index 100% rename from docker/gpu_cooling_monitor/src/web/app.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/web/app.py diff --git a/docker/gpu_cooling_monitor/src/web/run.py b/1_infrastructure/docker/gpu_cooling_monitor/src/web/run.py similarity index 100% rename from docker/gpu_cooling_monitor/src/web/run.py rename to 1_infrastructure/docker/gpu_cooling_monitor/src/web/run.py diff --git a/docker/gpu_cooling_monitor/src/web/static/css/style.css b/1_infrastructure/docker/gpu_cooling_monitor/src/web/static/css/style.css similarity index 100% rename from docker/gpu_cooling_monitor/src/web/static/css/style.css rename to 1_infrastructure/docker/gpu_cooling_monitor/src/web/static/css/style.css diff --git a/docker/gpu_cooling_monitor/src/web/static/js/dashboard.js b/1_infrastructure/docker/gpu_cooling_monitor/src/web/static/js/dashboard.js similarity index 100% rename from docker/gpu_cooling_monitor/src/web/static/js/dashboard.js rename to 1_infrastructure/docker/gpu_cooling_monitor/src/web/static/js/dashboard.js diff --git a/docker/gpu_cooling_monitor/src/web/templates/index.html b/1_infrastructure/docker/gpu_cooling_monitor/src/web/templates/index.html similarity index 100% rename from docker/gpu_cooling_monitor/src/web/templates/index.html rename to 1_infrastructure/docker/gpu_cooling_monitor/src/web/templates/index.html diff --git a/docker/gpu_cooling_monitor/start.sh b/1_infrastructure/docker/gpu_cooling_monitor/start.sh similarity index 100% rename from docker/gpu_cooling_monitor/start.sh rename to 1_infrastructure/docker/gpu_cooling_monitor/start.sh diff --git a/docker/jupyter_geumdo_lab/.cursorrules b/1_infrastructure/docker/jupyter_geumdo_lab/.cursorrules similarity index 100% rename from docker/jupyter_geumdo_lab/.cursorrules rename to 1_infrastructure/docker/jupyter_geumdo_lab/.cursorrules diff --git a/docker/jupyter_geumdo_lab/.dockerignore b/1_infrastructure/docker/jupyter_geumdo_lab/.dockerignore similarity index 100% rename from docker/jupyter_geumdo_lab/.dockerignore rename to 1_infrastructure/docker/jupyter_geumdo_lab/.dockerignore diff --git a/docker/jupyter_geumdo_lab/.gitignore b/1_infrastructure/docker/jupyter_geumdo_lab/.gitignore similarity index 100% rename from docker/jupyter_geumdo_lab/.gitignore rename to 1_infrastructure/docker/jupyter_geumdo_lab/.gitignore diff --git a/docker/jupyter_geumdo_lab/README.md b/1_infrastructure/docker/jupyter_geumdo_lab/README.md similarity index 100% rename from docker/jupyter_geumdo_lab/README.md rename to 1_infrastructure/docker/jupyter_geumdo_lab/README.md diff --git a/docker/jupyter_geumdo_lab/backup-cronjob.yaml b/1_infrastructure/docker/jupyter_geumdo_lab/backup-cronjob.yaml similarity index 100% rename from docker/jupyter_geumdo_lab/backup-cronjob.yaml rename to 1_infrastructure/docker/jupyter_geumdo_lab/backup-cronjob.yaml diff --git a/docker/jupyter_geumdo_lab/config.yaml b/1_infrastructure/docker/jupyter_geumdo_lab/config.yaml similarity index 100% rename from docker/jupyter_geumdo_lab/config.yaml rename to 1_infrastructure/docker/jupyter_geumdo_lab/config.yaml diff --git a/docker/jupyter_geumdo_lab/jupyter-hub-nginx.conf b/1_infrastructure/docker/jupyter_geumdo_lab/jupyter-hub-nginx.conf similarity index 100% rename from docker/jupyter_geumdo_lab/jupyter-hub-nginx.conf rename to 1_infrastructure/docker/jupyter_geumdo_lab/jupyter-hub-nginx.conf diff --git a/docker/jupyter_gpu_docker/Dockerfile b/1_infrastructure/docker/jupyter_gpu_docker/Dockerfile similarity index 100% rename from docker/jupyter_gpu_docker/Dockerfile rename to 1_infrastructure/docker/jupyter_gpu_docker/Dockerfile diff --git a/docker/jupyter_gpu_docker/README.md b/1_infrastructure/docker/jupyter_gpu_docker/README.md similarity index 100% rename from docker/jupyter_gpu_docker/README.md rename to 1_infrastructure/docker/jupyter_gpu_docker/README.md diff --git a/docker/jupyter_gpu_docker/docker-compose.yml b/1_infrastructure/docker/jupyter_gpu_docker/docker-compose.yml similarity index 100% rename from docker/jupyter_gpu_docker/docker-compose.yml rename to 1_infrastructure/docker/jupyter_gpu_docker/docker-compose.yml diff --git a/docker/jupyter_gpu_docker/rebuild_with_fix.sh b/1_infrastructure/docker/jupyter_gpu_docker/rebuild_with_fix.sh similarity index 100% rename from docker/jupyter_gpu_docker/rebuild_with_fix.sh rename to 1_infrastructure/docker/jupyter_gpu_docker/rebuild_with_fix.sh diff --git a/docker/jupyter_gpu_docker/requirements.txt b/1_infrastructure/docker/jupyter_gpu_docker/requirements.txt similarity index 100% rename from docker/jupyter_gpu_docker/requirements.txt rename to 1_infrastructure/docker/jupyter_gpu_docker/requirements.txt diff --git a/1_infrastructure/docker/potential_industry_partners.md b/1_infrastructure/docker/potential_industry_partners.md new file mode 100644 index 0000000000000000000000000000000000000000..393c0658054189dfa41cee0d876603ae600b90c0 --- /dev/null +++ b/1_infrastructure/docker/potential_industry_partners.md @@ -0,0 +1,129 @@ +# 잠재적 기업 파트너 리스트 및 접촉 계획 + +## 개요 +이 문서는 AI 강의 과정을 위한 산업 연계 프로그램을 개발하기 위한 잠재적 기업 파트너들의 리스트와 접촉 전략을 담고 있습니다. 산업 연계를 통해 학생들에게 실제 데이터와 문제를 기반으로 한 실무 경험을 제공하고, 취업 연계 기회를 확대하는 것을 목표로 합니다. + +## 1. 대상 기업 리스트 + +### 1.1. 대기업/중견기업 (4개사) + +| 기업명 | 산업 분야 | 예상 협업 영역 | 접촉 담당자 | 우선순위 | +|-------|----------|--------------|-----------|---------| +| **삼성전자** | 전자/IT/반도체 | 컴퓨터 비전, 자연어 처리 | AI 센터 교육 담당자 | 높음 | +| **현대자동차** | 자동차/모빌리티 | 자율주행, 센서 데이터 분석 | 연구소장 또는 교육 담당자 | 중간 | +| **네이버** | 인터넷/AI/검색 | 검색 엔진, 추천 시스템, NLP | NAVER CLOVA 교육 담당자 | 높음 | +| **LG CNS** | IT 컨설팅/시스템 통합 | 대규모 데이터 처리, AI 솔루션 | AI 사업부 책임자 | 중간 | + +### 1.2. 스타트업/성장기업 (4개사) + +| 기업명 | 산업 분야 | 예상 협업 영역 | 접촉 담당자 | 우선순위 | +|-------|----------|--------------|-----------|---------| +| **룰루랩** | 헬스케어/뷰티테크 | 피부 분석 AI, 컴퓨터 비전 | CTO 또는 기술 책임자 | 높음 | +| **퓨리오사AI** | 반도체/AI 칩 | 모델 최적화, 하드웨어 가속 | 교육 협력 담당자 | 중간 | +| **스켈터랩스** | 대화형 AI | 챗봇, 감정 분석 | AI 연구소장 | 높음 | +| **모두의연구소** | AI 연구/교육 | 커리큘럼 공동 개발, 멘토링 | 대표이사 | 높음 | + +### 1.3. 공공/연구 기관 (2개사) + +| 기관명 | 분야 | 예상 협업 영역 | 접촉 담당자 | 우선순위 | +|-------|-----|--------------|-----------|---------| +| **한국전자통신연구원(ETRI)** | 정보통신/전자 연구 | 음성 인식, 영상 분석 | 산학협력 담당자 | 중간 | +| **한국지능정보사회진흥원(NIA)** | 공공 데이터, AI 정책 | 공공 데이터 활용, AI 윤리 | 교육 협력 담당부서 | 중간 | + +## 2. 접촉 전략 및 계획 + +### 2.1. 기업 가치 제안 +기업 파트너에게 제안할 협력의 가치: + +1. **인재 발굴 및 채용 파이프라인** + - 교육 과정 수료생 중 우수 인재 조기 발굴 기회 + - 기업 맞춤형 역량을 갖춘 인재 양성 + +2. **실제 문제 해결을 통한 비즈니스 가치** + - 학생 프로젝트를 통한 기업 실제 문제 해결 + - 신선한 아이디어와 접근법 획득 + +3. **브랜드 가치 및 사회적 책임** + - AI 교육 지원을 통한 기업 이미지 제고 + - 디지털/AI 격차 해소에 기여 + +### 2.2. 세부 접촉 계획 + +#### 1단계: 초기 접촉 (1-2주) +- 인맥 네트워크를 활용한 소개 (1순위) +- 공식 이메일과 제안서 발송 (2순위) +- 채용/교육 담당자 LinkedIn 접촉 (3순위) + +#### 2단계: 제안 프레젠테이션 (3-4주) +- 기업별 맞춤형 협력 방안 제시 +- 구체적 협력 모델 3가지 제안: + 1. **멘토링 프로그램**: 기업 전문가가 학생 프로젝트 멘토링 + 2. **데이터셋 공유**: 비식별화된 실제 데이터 제공 + 3. **캡스톤 프로젝트**: 기업 실제 문제 기반 프로젝트 진행 + +#### 3단계: MOU 체결 (5-8주) +- 협력 범위 및 세부사항 협의 +- 법무 검토 및 MOU 초안 작성 +- 공식 체결 및 발표 + +## 3. 기업별 맞춤형 접근 전략 + +### 3.1. 삼성전자 +- **접촉 포인트**: AI 센터 교육 담당자 +- **제안 내용**: 컴퓨터 비전 과정에서 실제 사용 사례 공유, 학생 프로젝트 멘토링 +- **협력 모델**: 우수 학생 인턴십 연계 프로그램 + +### 3.2. 네이버 +- **접촉 포인트**: CLOVA 교육 협력 담당자 +- **제안 내용**: NLP 과정에서 한국어 처리 기술 사례 공유, 파파고/클로바 API 활용 교육 +- **협력 모델**: 우수 프로젝트 네이버 D2 Startup Factory 연계 가능성 + +### 3.3. 룰루랩 +- **접촉 포인트**: CTO +- **제안 내용**: 컴퓨터 비전 응용 사례로 피부 분석 AI 소개, 실제 과제 제시 +- **협력 모델**: 실제 데이터셋 제공 및 결과물 공유 + +### 3.4. 모두의연구소 +- **접촉 포인트**: 대표이사 +- **제안 내용**: 커리큘럼 공동 개발, 강사 교류, 커뮤니티 연계 +- **협력 모델**: 교육 콘텐츠 공동 개발 및 공유 + +## 4. 기대 성과 및 측정 지표 + +### 4.1. 기대 성과 +- 최소 3개 기업과의 파트너십 체결 +- 실제 산업 데이터셋 5개 이상 확보 +- 기업 멘토 10명 이상 참여 +- 취업 연계 기회 20개 이상 창출 + +### 4.2. 성과 측정 지표 +- 참여 기업 수 및 협력 지속 기간 +- 학생 만족도 평가 (기업 멘토링) +- 기업 제공 데이터셋 품질 및 활용도 +- 취업/인턴십 연계율 + +## 5. 일정 및 담당자 + +### 5.1. 일정 +- **1-2주차**: 초기 접촉 및 관계 구축 +- **3-4주차**: 제안서 발송 및 회의 요청 +- **5-6주차**: 미팅 진행 및 협력 방안 구체화 +- **7-8주차**: MOU 체결 협의 +- **9-10주차**: 파트너십 체결 및 프로그램 시작 + +### 5.2. 담당자 +- **산학협력 코디네이터**: 전체 기업 접촉 및 관리 담당 +- **교육과정 책임자**: 기술적 협력 범위 논의 +- **법무 담당**: MOU 검토 및 협약 작성 + +## 6. 위험 요소 및 대응 방안 + +### 6.1. 위험 요소 +- 기업의 데이터 보안 및 IP 우려 +- 협력 지속성 유지의 어려움 +- 기업과 교육 목표 간의 불일치 + +### 6.2. 대응 방안 +- 명확한 IP 정책 및 NDA 체결 +- 정기적 성과 공유 및 피드백 시스템 구축 +- 교육적 가치와 기업 가치의 균형점 모색 \ No newline at end of file diff --git a/1_infrastructure/docker/small_scale_gpu_resources_plan.md b/1_infrastructure/docker/small_scale_gpu_resources_plan.md new file mode 100644 index 0000000000000000000000000000000000000000..6a6b44697762c97eba69939beb5ac4a54bd5e281 --- /dev/null +++ b/1_infrastructure/docker/small_scale_gpu_resources_plan.md @@ -0,0 +1,142 @@ +# 소규모 GPU 리소스 활용 계획 + +## 1. 개요 +이 문서는 AI 교육 및 실습 환경에서 소규모 GPU 리소스를 효율적으로 활용하기 위한 계획과 전략을 제시합니다. GPU 리소스는 딥러닝 모델의 학습과 추론에 필수적이지만 비용이 높은 자원이므로, 제한된 리소스를 최대한 활용하는 방법에 초점을 맞추었습니다. + +## 2. 현재 GPU 리소스 현황 및 도입 계획 + +### 2.1 기존 리소스 +- 현재 보유 중인 NVIDIA GPU: 4대 (추정) + - 모니터링 시스템에 연결된 GPU 장비 확인됨 + - Docker 컨테이너에서 GPU 활용 구성 확인됨 + +### 2.2 도입 계획 +- **단기 계획 (3개월 이내)** + - 추가 NVIDIA RTX 3060 또는 4060 GPU 2대 도입 + - 기존 시스템 업그레이드 및 최적화 + +- **중기 계획 (6개월 이내)** + - 클라우드 GPU 인스턴스 활용 방안 수립 (필요 시) + - GPU 서버 공유 시스템 구축 + +## 3. GPU 리소스 관리 전략 + +### 3.1 시간 기반 할당 시스템 +- **시간대별 사용자 그룹 지정** + - 오전 (9AM-1PM): 초급 과정 학습자 + - 오후 (2PM-6PM): 중급 과정 학습자 + - 야간 (7PM-11PM): 고급 과정 및 프로젝트 작업 + +- **사전 예약 시스템** + - 웹 기반 GPU 리소스 예약 포털 구축 + - 최대 예약 시간: 1인당 4시간/일 + - 우선순위 기반 예약: 프로젝트 마감일 기준 + +### 3.2 작업 최적화 가이드라인 +- **모델 사전 설계 필수** + - GPU 사용 전 CPU에서 모델 아키텍처 검증 + - 하이퍼파라미터 사전 계획 + +- **배치 크기 최적화** + - GPU 메모리에 맞는 배치 크기 설정 가이드 제공 + - 그라디언트 누적(Gradient Accumulation) 기법 활용 + +- **작업 체크포인트** + - 30분 간격 자동 체크포인트 저장 + - 작업 재개 시스템 구축 + +## 4. 기술적 최적화 방안 + +### 4.1 모델 최적화 기법 교육 +- **모델 경량화 기술 교육** + - 지식 증류(Knowledge Distillation) + - 가지치기(Pruning) + - 양자화(Quantization) + +- **효율적 학습 기법** + - 전이학습(Transfer Learning) 활용 + - 점진적 학습(Progressive Learning) + - 작은 모델로 개념 증명 후 확장 + +### 4.2 GPU 메모리 최적화 +- **그래디언트 체크포인팅(Gradient Checkpointing)** + - 대규모 모델 학습 시 메모리 사용량 감소 + +- **혼합 정밀도 훈련(Mixed Precision Training)** + - FP16/BF16 활용으로 메모리 사용량 절감 및 속도 향상 + +- **메모리 효율적인 옵티마이저 활용** + - AdamW 대신 Lion 옵티마이저 사용 권장 + +## 5. 모니터링 및 관리 시스템 + +### 5.1 GPU 모니터링 시스템 구축 +- **실시간 모니터링 대시보드** + - GPU 사용률, 온도, 메모리 사용량 추적 + - 사용자별 리소스 사용 통계 + +- **알림 시스템** + - 과도한 GPU 사용 알림 + - 장시간 유휴 GPU 감지 및 알림 + +### 5.2 자원 회수 정책 +- **유휴 감지 시스템** + - 30분 이상 낮은 GPU 활용률(<10%) 감지 + - 사용자에게 경고 후 미응답 시 작업 저장 후 자원 회수 + +- **최대 실행 시간 제한** + - 기본 6시간 제한 (필요시 연장 신청) + - 장기 실행 작업은 야간 배치 작업으로 전환 + +## 6. 교육 과정별 리소스 활용 계획 + +### 6.1 초급 과정 +- **주요 내용:** Python 기초, ML 라이브러리 소개 +- **GPU 사용량:** 최소 또는 불필요 +- **대안 솔루션:** Google Colab 무료 버전 + +### 6.2 중급 과정 +- **주요 내용:** 딥러닝 기초, CNN, RNN 실습 +- **GPU 사용량:** 중간 (1-2시간/세션) +- **리소스 할당:** 공유 GPU, 시간제 접근 + +### 6.3 고급 과정 +- **주요 내용:** 대규모 모델, 프로젝트 개발 +- **GPU 사용량:** 높음 (3-4시간/세션) +- **리소스 할당:** 전용 GPU 시간, 야간 배치 작업 + +## 7. 비용 효율적인 대안 제시 + +### 7.1 클라우드 서비스 활용 +- **Google Colab Pro** ($9.99/월) + - 중간 규모 모델 학습에 적합 + - 접근성 용이, 환경 설정 최소화 + +- **Kaggle Notebooks** + - 무료 GPU 리소스 (주간 30시간) + - 공개 데이터셋 접근 용이 + +### 7.2 하이브리드 접근법 +- **로컬 GPU:** 개발, 디버깅, 소규모 실험 +- **클라우드 GPU:** 대규모 학습, 최종 모델 훈련 +- **사전 학습된 모델:** 미세 조정(Fine-tuning)으로 훈련 시간 단축 + +## 8. 구현 일정 + +### 8.1 1단계 (1-2개월) +- GPU 모니터링 시스템 구축 완료 +- 사용 가이드라인 문서화 +- 기본 예약 시스템 구현 + +### 8.2 2단계 (3-4개월) +- 자동화된 자원 관리 시스템 구축 +- 모델 최적화 워크숍 진행 +- 클라우드 GPU 연동 시스템 구축 + +### 8.3 3단계 (5-6개월) +- 고급 작업 스케줄링 시스템 구현 +- 사용자 피드백 기반 시스템 개선 +- 추가 리소스 확보 결정 + +## 9. 결론 +소규모 GPU 리소스 활용 계획은 제한된 자원을 효율적으로 사용하기 위한 기술적, 관리적 방안을 제시합니다. 적절한 시간 할당, 최적화 기법 교육, 모니터링 시스템 구축을 통해 학습자들이 필요한 GPU 리소스에 공평하게 접근하고 학습 효과를 극대화할 수 있도록 지원할 것입니다. \ No newline at end of file diff --git a/nginx/proxy_analysis.md b/1_infrastructure/nginx/proxy_analysis.md similarity index 100% rename from nginx/proxy_analysis.md rename to 1_infrastructure/nginx/proxy_analysis.md diff --git a/server_backup/README.md b/1_infrastructure/server_backup/README.md similarity index 100% rename from server_backup/README.md rename to 1_infrastructure/server_backup/README.md diff --git a/server_backup/geumdo_mirror_backup.sh b/1_infrastructure/server_backup/geumdo_mirror_backup.sh similarity index 100% rename from server_backup/geumdo_mirror_backup.sh rename to 1_infrastructure/server_backup/geumdo_mirror_backup.sh diff --git a/server_backup/iact_mirror_backup.sh b/1_infrastructure/server_backup/iact_mirror_backup.sh similarity index 100% rename from server_backup/iact_mirror_backup.sh rename to 1_infrastructure/server_backup/iact_mirror_backup.sh diff --git a/server_backup/last_day_of_month.sh b/1_infrastructure/server_backup/last_day_of_month.sh similarity index 100% rename from server_backup/last_day_of_month.sh rename to 1_infrastructure/server_backup/last_day_of_month.sh diff --git a/server_backup/server_backup_guide.md b/1_infrastructure/server_backup/server_backup_guide.md similarity index 100% rename from server_backup/server_backup_guide.md rename to 1_infrastructure/server_backup/server_backup_guide.md diff --git a/server_backup/source_backup.sh b/1_infrastructure/server_backup/source_backup.sh similarity index 100% rename from server_backup/source_backup.sh rename to 1_infrastructure/server_backup/source_backup.sh diff --git a/2_services/1_metaverse/nodam/.gitattributes b/2_services/1_metaverse/nodam/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..bdb0cabc87cf50106df6e15097dff816c8c3eb34 --- /dev/null +++ b/2_services/1_metaverse/nodam/.gitattributes @@ -0,0 +1,17 @@ +# Auto detect text files and perform LF normalization +* text=auto + +# Custom for Visual Studio +*.cs diff=csharp + +# Standard to msysgit +*.doc diff=astextplain +*.DOC diff=astextplain +*.docx diff=astextplain +*.DOCX diff=astextplain +*.dot diff=astextplain +*.DOT diff=astextplain +*.pdf diff=astextplain +*.PDF diff=astextplain +*.rtf diff=astextplain +*.RTF diff=astextplain diff --git a/2_services/1_metaverse/nodam/.gitignore b/2_services/1_metaverse/nodam/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..13fb3041ef21d63dd401684ac616c813b21f83da --- /dev/null +++ b/2_services/1_metaverse/nodam/.gitignore @@ -0,0 +1,44 @@ +# Windows image file caches +Thumbs.db +ehthumbs.db + +# Folder config file +Desktop.ini + +# Recycle Bin used on file shares +$RECYCLE.BIN/ + +# Windows Installer files +*.cab +*.msi +*.msm +*.msp + +# Windows shortcuts +*.lnk + +# ========================= +# Operating System Files +# ========================= + +# OSX +# ========================= + +.DS_Store +.AppleDouble +.LSOverride + +# Thumbnails +._* + +# Files that might appear on external disk +.Spotlight-V100 +.Trashes + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk +application/session/ diff --git a/2_services/1_metaverse/nodam/.htaccess b/2_services/1_metaverse/nodam/.htaccess new file mode 100644 index 0000000000000000000000000000000000000000..f28e384eb65ec1f1c334e763fef8191dd13d40ff --- /dev/null +++ b/2_services/1_metaverse/nodam/.htaccess @@ -0,0 +1,379 @@ +# ###################################################################### +# # CROSS-ORIGIN # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Cross-origin images | +# ---------------------------------------------------------------------- + + + + SetEnvIf Origin ":" IS_CORS + Header set Access-Control-Allow-Origin "*" env=IS_CORS + + + + +# ---------------------------------------------------------------------- +# | Cross-origin web fonts | +# ---------------------------------------------------------------------- + + + Header set Access-Control-Allow-Origin "*" + + + + +# ###################################################################### +# # ERRORS # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Custom error messages/pages | +# ---------------------------------------------------------------------- +ErrorDocument 404 /404.html + +# ---------------------------------------------------------------------- +# | Error prevention | +# ---------------------------------------------------------------------- +Options -MultiViews + + +# ###################################################################### +# # INTERNET EXPLORER # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Document modes | +# ---------------------------------------------------------------------- + + Header set X-UA-Compatible "IE=edge" + + + Header unset X-UA-Compatible + + + + +# ###################################################################### +# # MEDIA TYPES AND CHARACTER ENCODINGS # +# ###################################################################### + + # Data interchange + AddType application/atom+xml atom + AddType application/json json map topojson + AddType application/ld+json jsonld + AddType application/rss+xml rss + AddType application/vnd.geo+json geojson + AddType application/xml rdf xml + + # JavaScript + AddType application/javascript js + + # Manifest files + AddType application/manifest+json webmanifest + AddType application/x-web-app-manifest+json webapp + AddType text/cache-manifest appcache + + # Media files + AddType audio/mp4 f4a f4b m4a + AddType audio/ogg oga ogg opus + AddType image/bmp bmp + AddType image/svg+xml svg svgz + AddType image/webp webp + AddType video/mp4 f4v f4p m4v mp4 + AddType video/ogg ogv + AddType video/webm webm + AddType video/x-flv flv + AddType image/x-icon cur ico + + # Web fonts + AddType application/font-woff woff + AddType application/font-woff2 woff2 + AddType application/vnd.ms-fontobject eot + AddType application/x-font-ttf ttc ttf + AddType font/opentype otf + + # Other + AddType application/octet-stream safariextz + AddType application/x-bb-appworld bbaw + AddType application/x-chrome-extension crx + AddType application/x-opera-extension oex + AddType application/x-xpinstall xpi + AddType text/vcard vcard vcf + AddType text/vnd.rim.location.xloc xloc + AddType text/vtt vtt + AddType text/x-component htc + + +# ---------------------------------------------------------------------- +# | Character encodings | +# ---------------------------------------------------------------------- +AddDefaultCharset utf-8 + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + AddCharset utf-8 .atom \ + .bbaw \ + .css \ + .geojson \ + .js \ + .json \ + .jsonld \ + .manifest \ + .rdf \ + .rss \ + .topojson \ + .vtt \ + .webapp \ + .webmanifest \ + .xloc \ + .xml + + + +# ###################################################################### +# # REWRITES # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Rewrite engine | +# ---------------------------------------------------------------------- + + RewriteEngine On + Options +FollowSymlinks + + # - - - Use for 1and1 - - - + # RewriteBase / + + RewriteCond %{REQUEST_FILENAME} !-f + RewriteCond %{REQUEST_FILENAME} !-d + RewriteRule ^(.*)$ index.php/$1 [L] + + + +# ###################################################################### +# # SECURITY # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Clickjacking | +# ---------------------------------------------------------------------- + + Header set X-Frame-Options "SAMEORIGIN" + + +# ---------------------------------------------------------------------- +# | Content Security Policy (CSP) | +# ---------------------------------------------------------------------- +# +# Header set Content-Security-Policy "script-src 'self'; object-src 'self'" +# + +# ---------------------------------------------------------------------- +# | File access | +# ---------------------------------------------------------------------- + + Options -Indexes + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + RewriteEngine On + RewriteCond %{REQUEST_URI} "!(^|/)\.well-known/([^./]+./?)+$" [NC] + RewriteCond %{SCRIPT_FILENAME} -d [OR] + RewriteCond %{SCRIPT_FILENAME} -f + RewriteRule "(^|/)\." - [F] + + +# - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + # Apache < 2.3 + + Order allow,deny + Deny from all + Satisfy All + + + # Apache ≥ 2.3 + + Require all denied + + + +# ---------------------------------------------------------------------- +# | Reducing MIME type security risks | +# ---------------------------------------------------------------------- + + Header set X-Content-Type-Options "nosniff" + + +# ---------------------------------------------------------------------- +# | Reflected Cross-Site Scripting (XSS) attacks | +# ---------------------------------------------------------------------- + + Header set X-XSS-Protection "1; mode=block" + + + Header unset X-XSS-Protection + + + +# ---------------------------------------------------------------------- +# | Server-side technology information | +# ---------------------------------------------------------------------- + + Header unset X-Powered-By + + +# ---------------------------------------------------------------------- +# | Server software information | +# ---------------------------------------------------------------------- +ServerSignature Off + + +# ###################################################################### +# # WEB PERFORMANCE # +# ###################################################################### + +# ---------------------------------------------------------------------- +# | Compression | +# ---------------------------------------------------------------------- + + + + SetEnvIfNoCase ^(Accept-EncodXng|X-cept-Encoding|X{15}|~{15}|-{15})$ ^((gzip|deflate)\s*,?\s*)+|[X~-]{4,13}$ HAVE_Accept-Encoding + RequestHeader append Accept-Encoding "gzip,deflate" env=HAVE_Accept-Encoding + + + + + Header append Vary: Accept-Encoding + + + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + AddOutputFilterByType DEFLATE "application/atom+xml" \ + "application/javascript" \ + "application/json" \ + "application/ld+json" \ + "application/manifest+json" \ + "application/rdf+xml" \ + "application/rss+xml" \ + "application/schema+json" \ + "application/vnd.geo+json" \ + "application/vnd.ms-fontobject" \ + "application/x-font-ttf" \ + "application/x-javascript" \ + "application/x-web-app-manifest+json" \ + "application/xhtml+xml" \ + "application/xml" \ + "font/eot" \ + "font/opentype" \ + "image/bmp" \ + "image/svg+xml" \ + "image/vnd.microsoft.icon" \ + "image/x-icon" \ + "text/cache-manifest" \ + "text/css" \ + "text/html" \ + "text/javascript" \ + "text/plain" \ + "text/vcard" \ + "text/vnd.rim.location.xloc" \ + "text/vtt" \ + "text/x-component" \ + "text/x-cross-domain-policy" \ + "text/xml" + + + + # - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + AddEncoding gzip svgz + + + +# ---------------------------------------------------------------------- +# | ETags | +# ---------------------------------------------------------------------- + + Header unset ETag + + +FileETag None + +# ---------------------------------------------------------------------- +# | Expires headers | +# ---------------------------------------------------------------------- + + ExpiresActive on + ExpiresDefault "access plus 1 month" + + # CSS + ExpiresByType text/css "access plus 1 year" + + # Data interchange + ExpiresByType application/atom+xml "access plus 1 hour" + ExpiresByType application/rdf+xml "access plus 1 hour" + ExpiresByType application/rss+xml "access plus 1 hour" + ExpiresByType application/json "access plus 0 seconds" + ExpiresByType application/ld+json "access plus 0 seconds" + ExpiresByType application/schema+json "access plus 0 seconds" + ExpiresByType application/vnd.geo+json "access plus 0 seconds" + ExpiresByType application/xml "access plus 0 seconds" + ExpiresByType text/xml "access plus 0 seconds" + + # Favicon (cannot be renamed!) and cursor images + ExpiresByType image/vnd.microsoft.icon "access plus 1 week" + ExpiresByType image/x-icon "access plus 1 week" + + # HTML + ExpiresByType text/html "access plus 0 seconds" + + # JavaScript + ExpiresByType application/javascript "access plus 1 year" + ExpiresByType application/x-javascript "access plus 1 year" + ExpiresByType text/javascript "access plus 1 year" + + # Manifest files + ExpiresByType application/manifest+json "access plus 1 week" + ExpiresByType application/x-web-app-manifest+json "access plus 0 seconds" + ExpiresByType text/cache-manifest "access plus 0 seconds" + + # Media files + ExpiresByType audio/ogg "access plus 1 month" + ExpiresByType image/bmp "access plus 1 month" + ExpiresByType image/gif "access plus 1 month" + ExpiresByType image/jpeg "access plus 1 month" + ExpiresByType image/png "access plus 1 month" + ExpiresByType image/svg+xml "access plus 1 month" + ExpiresByType image/webp "access plus 1 month" + ExpiresByType video/mp4 "access plus 1 month" + ExpiresByType video/ogg "access plus 1 month" + ExpiresByType video/webm "access plus 1 month" + + # Web fonts + # Embedded OpenType (EOT) + ExpiresByType application/vnd.ms-fontobject "access plus 1 month" + ExpiresByType font/eot "access plus 1 month" + # OpenType + ExpiresByType font/opentype "access plus 1 month" + # TrueType + ExpiresByType application/x-font-ttf "access plus 1 month" + # Web Open Font Format (WOFF) 1.0 + ExpiresByType application/font-woff "access plus 1 month" + ExpiresByType application/x-font-woff "access plus 1 month" + ExpiresByType font/woff "access plus 1 month" + # Web Open Font Format (WOFF) 2.0 + ExpiresByType application/font-woff2 "access plus 1 month" + + # Other + ExpiresByType text/x-cross-domain-policy "access plus 1 week" + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/README.md b/2_services/1_metaverse/nodam/README.md new file mode 100644 index 0000000000000000000000000000000000000000..79d7466fbaafc2f83e48026643fd5c9dc19a0a7c --- /dev/null +++ b/2_services/1_metaverse/nodam/README.md @@ -0,0 +1,62 @@ +# CI-AdminLTE +CodeIgniter 3.1.10 with AdminLTE 2.3.11 + +## Installation + +1. Unzip the package. +2. Upload the `CI-AdminLTE` folders and files to your server. Normally the index.php file will be at your root. +3. Open the `application/config/common/dp_config.php` file with a text editor and set your base URL: +``` +// Fill in the file of your project here when you develop locally. +$host_dev = 'CI-AdminLTE'; + +// Fill in the domain name here when your project is online. +// Example : www.johndoe.com +// johndoe.com +$host_prod = 'your_domain.tld'; +``` +4. Create a table named `ci_adminlte` and inject the data from the `install/sql/ci_adminlte.sql` file. +5. Change if necessary the connection information to your database in the `application/config/database.php` file. + +## Demo + +https://demo.domprojects.com/ci-adminlte/auth/login + +### Login + * Email : `admin@admin.com` / Password : `password` + +## Browser Compatibility +Support for most major browsers including Chrome, Firefox, IE9+, Opera and Safari. + +## Languages + * English + * French + * Portuguese (translation by [marcelod](https://github.com/marcelod)) + * ... and more soon + +## Server Requirements + +PHP version 5.6 or newer is recommended. + +It should work on 5.4.8 as well, but we strongly advise you NOT to run such old versions of PHP, because of potential security and performance issues, as well as missing features. + +## Dependencies +| NAME | VERSION | WEB | REPO | +| :--- | :---: | :---: | :---: | +| CodeIgniter | 3.1.10 | [Website](https://codeigniter.com) | [Github](https://github.com/bcit-ci/CodeIgniter/) +| AdminLTE | 2.3.11 | [Website](https://adminlte.io) | [Github](https://github.com/almasaeed2010/AdminLTE/) +| Bootstrap | 3.3.7 | [Website](https://getbootstrap.com/docs/3.3) | [Github](https://github.com/twbs/bootstrap) +| Ion Auth | 2.6.0 | [Website](http://benedmunds.com/ion_auth) | [Github](https://github.com/benedmunds/CodeIgniter-Ion-Auth) +| jQuery | 2.2.4 | [Website](http://jquery.com) | [Github](https://github.com/jquery/jquery) +| Font Awesome | 4.7.0 | [Website](https://fontawesome.com/v4.7.0) | [Github](https://github.com/FortAwesome/Font-Awesome) +| Mobile Detect | 2.8.30 | [Website](http://mobiledetect.net) | [Github](https://github.com/serbanghita/Mobile-Detect) + +## CodeIgniter 3 Documentation + +* [User guide](https://codeigniter.com/user_guide) + +## Reference + +* [CodeIgniter](https://github.com/bcit-ci/CodeIgniter) +* [Translations for CodeIgniter System](https://github.com/bcit-ci/codeigniter3-translations) +* [AdminLTE](https://github.com/almasaeed2010/AdminLTE) diff --git a/2_services/1_metaverse/nodam/application/.htaccess b/2_services/1_metaverse/nodam/application/.htaccess new file mode 100644 index 0000000000000000000000000000000000000000..6c63ed4c4d2735410ea039fe35a07762adb3710b --- /dev/null +++ b/2_services/1_metaverse/nodam/application/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/cache/.htaccess b/2_services/1_metaverse/nodam/application/cache/.htaccess new file mode 100644 index 0000000000000000000000000000000000000000..6c63ed4c4d2735410ea039fe35a07762adb3710b --- /dev/null +++ b/2_services/1_metaverse/nodam/application/cache/.htaccess @@ -0,0 +1,6 @@ + + Require all denied + + + Deny from all + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/cache/index.html b/2_services/1_metaverse/nodam/application/cache/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/cache/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

Directory access is forbidden.

+ + + diff --git a/2_services/1_metaverse/nodam/application/config/admin/dp_config.php b/2_services/1_metaverse/nodam/application/config/admin/dp_config.php new file mode 100644 index 0000000000000000000000000000000000000000..05d13825fe462a4db3748f4798da71c6d8f5d2a8 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/admin/dp_config.php @@ -0,0 +1,36 @@ +'; +$config['pagetitle_close'] = ''; +$config['pagetitle_el_open'] = ''; +$config['pagetitle_el_close'] = ''; + +/* Breadcrumbs */ +$config['breadcrumb_open'] = ''; +$config['breadcrumb_el_open'] = '
  • '; +$config['breadcrumb_el_close'] = '
  • '; +$config['breadcrumb_el_first'] = ''; +$config['breadcrumb_el_last'] = '
  • '; + + diff --git a/2_services/1_metaverse/nodam/application/config/admin/index.html b/2_services/1_metaverse/nodam/application/config/admin/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/admin/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/config/autoload.php b/2_services/1_metaverse/nodam/application/config/autoload.php new file mode 100644 index 0000000000000000000000000000000000000000..8d4891902c951d155c96b38616619bd949ef5717 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/autoload.php @@ -0,0 +1,129 @@ + 'ua'); +*/ +$autoload['libraries'] = array('form_validation', 'ion_auth', 'template', 'common/mobile_detect'); + +/* +| ------------------------------------------------------------------- +| Auto-load Drivers +| ------------------------------------------------------------------- +| These classes are located in system/libraries/ or in your +| application/libraries/ directory, but are also placed inside their +| own subdirectory and they extend the CI_Driver_Library class. They +| offer multiple interchangeable driver options. +| +| Prototype: +| +| $autoload['drivers'] = array('cache'); +*/ +$autoload['drivers'] = array(); + +/* +| ------------------------------------------------------------------- +| Auto-load Helper Files +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['helper'] = array('url', 'file'); +*/ +$autoload['helper'] = array('array', 'language', 'url'); + +/* +| ------------------------------------------------------------------- +| Auto-load Config files +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['config'] = array('config1', 'config2'); +| +| NOTE: This item is intended for use ONLY if you have created custom +| config files. Otherwise, leave it blank. +| +*/ +$autoload['config'] = array('common/dp_config', 'common/dp_language'); + +/* +| ------------------------------------------------------------------- +| Auto-load Language files +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['language'] = array('lang1', 'lang2'); +| +| NOTE: Do not include the "_lang" part of your file. For example +| "codeigniter_lang.php" would be referenced as array('codeigniter'); +| +*/ +$autoload['language'] = array(); + +/* +| ------------------------------------------------------------------- +| Auto-load Models +| ------------------------------------------------------------------- +| Prototype: +| +| $autoload['model'] = array('first_model', 'second_model'); +| +| You can also supply an alternative model name to be assigned +| in the controller: +| +| $autoload['model'] = array('first_model' => 'first'); +*/ +$autoload['model'] = array('common/prefs_model'); diff --git a/2_services/1_metaverse/nodam/application/config/common/dp_config.php b/2_services/1_metaverse/nodam/application/config/common/dp_config.php new file mode 100644 index 0000000000000000000000000000000000000000..2bf6dc351ce05ade963490f3bb01f530b2a46801 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/common/dp_config.php @@ -0,0 +1,52 @@ + 'en', + 'french' => 'fr', + 'portuguese' => 'pt' +); diff --git a/2_services/1_metaverse/nodam/application/config/common/index.html b/2_services/1_metaverse/nodam/application/config/common/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/common/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/config/config.php b/2_services/1_metaverse/nodam/application/config/config.php new file mode 100644 index 0000000000000000000000000000000000000000..f02d8c13401a548e4b034327ac7af10bdd5a803f --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/config.php @@ -0,0 +1,504 @@ +]+$/i +| +| DO NOT CHANGE THIS UNLESS YOU FULLY UNDERSTAND THE REPERCUSSIONS!! +| +*/ +$config['permitted_uri_chars'] = 'a-z 0-9~%.:_\-'; + +/* +|-------------------------------------------------------------------------- +| Enable Query Strings +|-------------------------------------------------------------------------- +| +| By default CodeIgniter uses search-engine friendly segment based URLs: +| example.com/who/what/where/ +| +| By default CodeIgniter enables access to the $_GET array. If for some +| reason you would like to disable it, set 'allow_get_array' to FALSE. +| +| You can optionally enable standard query string based URLs: +| example.com?who=me&what=something&where=here +| +| Options are: TRUE or FALSE (boolean) +| +| The other items let you set the query string 'words' that will +| invoke your controllers and its functions: +| example.com/index.php?c=controller&m=function +| +| Please note that some of the helpers won't work as expected when +| this feature is enabled, since CodeIgniter is designed primarily to +| use segment based URLs. +| +*/ +$config['allow_get_array'] = TRUE; +$config['enable_query_strings'] = FALSE; +$config['controller_trigger'] = 'c'; +$config['function_trigger'] = 'm'; +$config['directory_trigger'] = 'd'; + +/* +|-------------------------------------------------------------------------- +| Error Logging Threshold +|-------------------------------------------------------------------------- +| +| You can enable error logging by setting a threshold over zero. The +| threshold determines what gets logged. Threshold options are: +| +| 0 = Disables logging, Error logging TURNED OFF +| 1 = Error Messages (including PHP errors) +| 2 = Debug Messages +| 3 = Informational Messages +| 4 = All Messages +| +| You can also pass an array with threshold levels to show individual error types +| +| array(2) = Debug Messages, without Error Messages +| +| For a live site you'll usually only enable Errors (1) to be logged otherwise +| your log files will fill up very fast. +| +*/ +$config['log_threshold'] = 0; + +/* +|-------------------------------------------------------------------------- +| Error Logging Directory Path +|-------------------------------------------------------------------------- +| +| Leave this BLANK unless you would like to set something other than the default +| application/logs/ directory. Use a full server path with trailing slash. +| +*/ +$config['log_path'] = ''; + +/* +|-------------------------------------------------------------------------- +| Log File Extension +|-------------------------------------------------------------------------- +| +| The default filename extension for log files. The default 'php' allows for +| protecting the log files via basic scripting, when they are to be stored +| under a publicly accessible directory. +| +| Note: Leaving it blank will default to 'php'. +| +*/ +$config['log_file_extension'] = ''; + +/* +|-------------------------------------------------------------------------- +| Log File Permissions +|-------------------------------------------------------------------------- +| +| The file system permissions to be applied on newly created log files. +| +| IMPORTANT: This MUST be an integer (no quotes) and you MUST use octal +| integer notation (i.e. 0700, 0644, etc.) +*/ +$config['log_file_permissions'] = 0644; + +/* +|-------------------------------------------------------------------------- +| Date Format for Logs +|-------------------------------------------------------------------------- +| +| Each item that is logged has an associated date. You can use PHP date +| codes to set your own date formatting +| +*/ +$config['log_date_format'] = 'Y-m-d H:i:s'; + +/* +|-------------------------------------------------------------------------- +| Error Views Directory Path +|-------------------------------------------------------------------------- +| +| Leave this BLANK unless you would like to set something other than the default +| application/views/errors/ directory. Use a full server path with trailing slash. +| +*/ +$config['error_views_path'] = ''; + +/* +|-------------------------------------------------------------------------- +| Cache Directory Path +|-------------------------------------------------------------------------- +| +| Leave this BLANK unless you would like to set something other than the default +| application/cache/ directory. Use a full server path with trailing slash. +| +*/ +$config['cache_path'] = ''; + +/* +|-------------------------------------------------------------------------- +| Cache Include Query String +|-------------------------------------------------------------------------- +| +| Whether to take the URL query string into consideration when generating +| output cache files. Valid options are: +| +| FALSE = Disabled +| TRUE = Enabled, take all query parameters into account. +| Please be aware that this may result in numerous cache +| files generated for the same page over and over again. +| array('q') = Enabled, but only take into account the specified list +| of query parameters. +| +*/ +$config['cache_query_string'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Encryption Key +|-------------------------------------------------------------------------- +| +| If you use the Encryption class, you must set an encryption key. +| See the user guide for more info. +| +| http://codeigniter.com/user_guide/libraries/encryption.html +| +*/ +$config['encryption_key'] = ''; + +/* +|-------------------------------------------------------------------------- +| Session Variables +|-------------------------------------------------------------------------- +| +| 'sess_driver' +| +| The storage driver to use: files, database, redis, memcached +| +| 'sess_cookie_name' +| +| The session cookie name, must contain only [0-9a-z_-] characters +| +| 'sess_expiration' +| +| The number of SECONDS you want the session to last. +| Setting to 0 (zero) means expire when the browser is closed. +| +| 'sess_save_path' +| +| The location to save sessions to, driver dependent. +| +| For the 'files' driver, it's a path to a writable directory. +| WARNING: Only absolute paths are supported! +| +| For the 'database' driver, it's a table name. +| Please read up the manual for the format with other session drivers. +| +| IMPORTANT: You are REQUIRED to set a valid save path! +| +| 'sess_match_ip' +| +| Whether to match the user's IP address when reading the session data. +| +| 'sess_time_to_update' +| +| How many seconds between CI regenerating the session ID. +| +| 'sess_regenerate_destroy' +| +| Whether to destroy session data associated with the old session ID +| when auto-regenerating the session ID. When set to FALSE, the data +| will be later deleted by the garbage collector. +| +| Other session cookie settings are shared with the rest of the application, +| except for 'cookie_prefix' and 'cookie_httponly', which are ignored here. +| +*/ +$config['sess_driver'] = 'files'; +$config['sess_cookie_name'] = 'ci_session'; +$config['sess_expiration'] = 7200; +$config['sess_save_path'] = APPPATH.DIRECTORY_SEPARATOR.'session'; +$config['sess_match_ip'] = FALSE; +$config['sess_time_to_update'] = 300; +$config['sess_regenerate_destroy'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Cookie Related Variables +|-------------------------------------------------------------------------- +| +| 'cookie_prefix' = Set a cookie name prefix if you need to avoid collisions +| 'cookie_domain' = Set to .your-domain.com for site-wide cookies +| 'cookie_path' = Typically will be a forward slash +| 'cookie_secure' = Cookie will only be set if a secure HTTPS connection exists. +| 'cookie_httponly' = Cookie will only be accessible via HTTP(S) (no javascript) +| +| Note: These settings (with the exception of 'cookie_prefix' and +| 'cookie_httponly') will also affect sessions. +| +*/ +$config['cookie_prefix'] = ''; +$config['cookie_domain'] = ''; +$config['cookie_path'] = '/'; +$config['cookie_secure'] = FALSE; +$config['cookie_httponly'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Standardize newlines +|-------------------------------------------------------------------------- +| +| Determines whether to standardize newline characters in input data, +| meaning to replace \r\n, \r, \n occurrences with the PHP_EOL value. +| +| This is particularly useful for portability between UNIX-based OSes, +| (usually \n) and Windows (\r\n). +| +*/ +$config['standardize_newlines'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Global XSS Filtering +|-------------------------------------------------------------------------- +| +| Determines whether the XSS filter is always active when GET, POST or +| COOKIE data is encountered +| +| WARNING: This feature is DEPRECATED and currently available only +| for backwards compatibility purposes! +| +*/ +$config['global_xss_filtering'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Cross Site Request Forgery +|-------------------------------------------------------------------------- +| Enables a CSRF cookie token to be set. When set to TRUE, token will be +| checked on a submitted form. If you are accepting user data, it is strongly +| recommended CSRF protection be enabled. +| +| 'csrf_token_name' = The token name +| 'csrf_cookie_name' = The cookie name +| 'csrf_expire' = The number in seconds the token should expire. +| 'csrf_regenerate' = Regenerate token on every submission +| 'csrf_exclude_uris' = Array of URIs which ignore CSRF checks +*/ +$config['csrf_protection'] = FALSE; +$config['csrf_token_name'] = 'csrf_test_name'; +$config['csrf_cookie_name'] = 'csrf_cookie_name'; +$config['csrf_expire'] = 7200; +$config['csrf_regenerate'] = TRUE; +$config['csrf_exclude_uris'] = array(); + +/* +|-------------------------------------------------------------------------- +| Output Compression +|-------------------------------------------------------------------------- +| +| Enables Gzip output compression for faster page loads. When enabled, +| the output class will test whether your server supports Gzip. +| Even if it does, however, not all browsers support compression +| so enable only if you are reasonably sure your visitors can handle it. +| +| Only used if zlib.output_compression is turned off in your php.ini. +| Please do not use it together with httpd-level output compression. +| +| VERY IMPORTANT: If you are getting a blank page when compression is enabled it +| means you are prematurely outputting something to your browser. It could +| even be a line of whitespace at the end of one of your scripts. For +| compression to work, nothing can be sent before the output buffer is called +| by the output class. Do not 'echo' any values with compression enabled. +| +*/ +$config['compress_output'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Master Time Reference +|-------------------------------------------------------------------------- +| +| Options are 'local' or any PHP supported timezone. This preference tells +| the system whether to use your server's local time as the master 'now' +| reference, or convert it to the configured one timezone. See the 'date +| helper' page of the user guide for information regarding date handling. +| +*/ +$config['time_reference'] = 'local'; + +/* +|-------------------------------------------------------------------------- +| Rewrite PHP Short Tags +|-------------------------------------------------------------------------- +| +| If your PHP installation does not have short tag support enabled CI +| can rewrite the tags on-the-fly, enabling you to utilize that syntax +| in your view files. Options are TRUE or FALSE (boolean) +| +| Note: You need to have eval() enabled for this to work. +| +*/ +$config['rewrite_short_tags'] = FALSE; + +/* +|-------------------------------------------------------------------------- +| Reverse Proxy IPs +|-------------------------------------------------------------------------- +| +| If your server is behind a reverse proxy, you must whitelist the proxy +| IP addresses from which CodeIgniter should trust headers such as +| HTTP_X_FORWARDED_FOR and HTTP_CLIENT_IP in order to properly identify +| the visitor's IP address. +| +| You can use both an array or a comma-separated list of proxy addresses, +| as well as specifying whole subnets. Here are a few examples: +| +| Comma-separated: '10.0.1.200,192.168.5.0/24' +| Array: array('10.0.1.200', '192.168.5.0/24') +*/ +$config['proxy_ips'] = ''; diff --git a/2_services/1_metaverse/nodam/application/config/constants.php b/2_services/1_metaverse/nodam/application/config/constants.php new file mode 100644 index 0000000000000000000000000000000000000000..e8d2c00ea033031ab6299381906a4c67c047fbe1 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/constants.php @@ -0,0 +1,85 @@ +db->last_query() and profiling of DB queries. +| When you run a query, with this setting set to TRUE (default), +| CodeIgniter will store the SQL statement for debugging purposes. +| However, this may cause high memory usage, especially if you run +| a lot of SQL queries ... disable this to avoid that problem. +| +| The $active_group variable lets you choose which connection group to +| make active. By default there is only one group (the 'default' group). +| +| The $query_builder variables lets you determine whether or not to load +| the query builder class. +*/ +$active_group = 'default'; +$query_builder = TRUE; + +$db['default'] = array( + 'dsn' => '', + 'hostname' => '127.0.0.1', + 'port' => '53306', + 'username' => 'root', + 'password' => '1q2w3e4r5t', + 'database' => 'test_nodam', + 'dbdriver' => 'mysqli', + 'dbprefix' => '', + 'pconnect' => FALSE, + 'db_debug' => (ENVIRONMENT !== 'production'), + 'cache_on' => FALSE, + 'cachedir' => '', + 'char_set' => 'utf8', + 'dbcollat' => 'utf8mb4_unicode_ci', + 'swap_pre' => '', + 'encrypt' => FALSE, + 'compress' => FALSE, + 'stricton' => FALSE, + 'failover' => array(), + 'save_queries' => TRUE +); diff --git a/2_services/1_metaverse/nodam/application/config/doctypes.php b/2_services/1_metaverse/nodam/application/config/doctypes.php new file mode 100644 index 0000000000000000000000000000000000000000..59a7991e3e3bef872b9fe6e5df56d8bb210d0cfa --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/doctypes.php @@ -0,0 +1,24 @@ + '', + 'xhtml1-strict' => '', + 'xhtml1-trans' => '', + 'xhtml1-frame' => '', + 'xhtml-basic11' => '', + 'html5' => '', + 'html4-strict' => '', + 'html4-trans' => '', + 'html4-frame' => '', + 'mathml1' => '', + 'mathml2' => '', + 'svg10' => '', + 'svg11' => '', + 'svg11-basic' => '', + 'svg11-tiny' => '', + 'xhtml-math-svg-xh' => '', + 'xhtml-math-svg-sh' => '', + 'xhtml-rdfa-1' => '', + 'xhtml-rdfa-2' => '' +); diff --git a/2_services/1_metaverse/nodam/application/config/foreign_chars.php b/2_services/1_metaverse/nodam/application/config/foreign_chars.php new file mode 100644 index 0000000000000000000000000000000000000000..ac406e3d4c47d5d1ff5dc44a4113c8f2ea160f42 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/foreign_chars.php @@ -0,0 +1,103 @@ + 'ae', + '/ö|œ/' => 'oe', + '/ü/' => 'ue', + '/Ä/' => 'Ae', + '/Ü/' => 'Ue', + '/Ö/' => 'Oe', + '/À|Á|Â|Ã|Ä|Å|Ǻ|Ā|Ă|Ą|Ǎ|Α|Ά|Ả|Ạ|Ầ|Ẫ|Ẩ|Ậ|Ằ|Ắ|Ẵ|Ẳ|Ặ|А/' => 'A', + '/à|á|â|ã|å|ǻ|ā|ă|ą|ǎ|ª|α|ά|ả|ạ|ầ|ấ|ẫ|ẩ|ậ|ằ|ắ|ẵ|ẳ|ặ|а/' => 'a', + '/Б/' => 'B', + '/б/' => 'b', + '/Ç|Ć|Ĉ|Ċ|Č/' => 'C', + '/ç|ć|ĉ|ċ|č/' => 'c', + '/Д/' => 'D', + '/д/' => 'd', + '/Ð|Ď|Đ|Δ/' => 'Dj', + '/ð|ď|đ|δ/' => 'dj', + '/È|É|Ê|Ë|Ē|Ĕ|Ė|Ę|Ě|Ε|Έ|Ẽ|Ẻ|Ẹ|Ề|Ế|Ễ|Ể|Ệ|Е|Э/' => 'E', + '/è|é|ê|ë|ē|ĕ|ė|ę|ě|έ|ε|ẽ|ẻ|ẹ|ề|ế|ễ|ể|ệ|е|э/' => 'e', + '/Ф/' => 'F', + '/ф/' => 'f', + '/Ĝ|Ğ|Ġ|Ģ|Γ|Г|Ґ/' => 'G', + '/ĝ|ğ|ġ|ģ|γ|г|ґ/' => 'g', + '/Ĥ|Ħ/' => 'H', + '/ĥ|ħ/' => 'h', + '/Ì|Í|Î|Ï|Ĩ|Ī|Ĭ|Ǐ|Į|İ|Η|Ή|Ί|Ι|Ϊ|Ỉ|Ị|И|Ы/' => 'I', + '/ì|í|î|ï|ĩ|ī|ĭ|ǐ|į|ı|η|ή|ί|ι|ϊ|ỉ|ị|и|ы|ї/' => 'i', + '/Ĵ/' => 'J', + '/ĵ/' => 'j', + '/Ķ|Κ|К/' => 'K', + '/ķ|κ|к/' => 'k', + '/Ĺ|Ļ|Ľ|Ŀ|Ł|Λ|Л/' => 'L', + '/ĺ|ļ|ľ|ŀ|ł|λ|л/' => 'l', + '/М/' => 'M', + '/м/' => 'm', + '/Ñ|Ń|Ņ|Ň|Ν|Н/' => 'N', + '/ñ|ń|ņ|ň|ʼn|ν|н/' => 'n', + '/Ò|Ó|Ô|Õ|Ō|Ŏ|Ǒ|Ő|Ơ|Ø|Ǿ|Ο|Ό|Ω|Ώ|Ỏ|Ọ|Ồ|Ố|Ỗ|Ổ|Ộ|Ờ|Ớ|Ỡ|Ở|Ợ|О/' => 'O', + '/ò|ó|ô|õ|ō|ŏ|ǒ|ő|ơ|ø|ǿ|º|ο|ό|ω|ώ|ỏ|ọ|ồ|ố|ỗ|ổ|ộ|ờ|ớ|ỡ|ở|ợ|о/' => 'o', + '/П/' => 'P', + '/п/' => 'p', + '/Ŕ|Ŗ|Ř|Ρ|Р/' => 'R', + '/ŕ|ŗ|ř|ρ|р/' => 'r', + '/Ś|Ŝ|Ş|Ș|Š|Σ|С/' => 'S', + '/ś|ŝ|ş|ș|š|ſ|σ|ς|с/' => 's', + '/Ț|Ţ|Ť|Ŧ|τ|Т/' => 'T', + '/ț|ţ|ť|ŧ|т/' => 't', + '/Þ|þ/' => 'th', + '/Ù|Ú|Û|Ũ|Ū|Ŭ|Ů|Ű|Ų|Ư|Ǔ|Ǖ|Ǘ|Ǚ|Ǜ|Ũ|Ủ|Ụ|Ừ|Ứ|Ữ|Ử|Ự|У/' => 'U', + '/ù|ú|û|ũ|ū|ŭ|ů|ű|ų|ư|ǔ|ǖ|ǘ|ǚ|ǜ|υ|ύ|ϋ|ủ|ụ|ừ|ứ|ữ|ử|ự|у/' => 'u', + '/Ý|Ÿ|Ŷ|Υ|Ύ|Ϋ|Ỳ|Ỹ|Ỷ|Ỵ|Й/' => 'Y', + '/ý|ÿ|ŷ|ỳ|ỹ|ỷ|ỵ|й/' => 'y', + '/В/' => 'V', + '/в/' => 'v', + '/Ŵ/' => 'W', + '/ŵ/' => 'w', + '/Ź|Ż|Ž|Ζ|З/' => 'Z', + '/ź|ż|ž|ζ|з/' => 'z', + '/Æ|Ǽ/' => 'AE', + '/ß/' => 'ss', + '/IJ/' => 'IJ', + '/ij/' => 'ij', + '/Œ/' => 'OE', + '/ƒ/' => 'f', + '/ξ/' => 'ks', + '/π/' => 'p', + '/β/' => 'v', + '/μ/' => 'm', + '/ψ/' => 'ps', + '/Ё/' => 'Yo', + '/ё/' => 'yo', + '/Є/' => 'Ye', + '/є/' => 'ye', + '/Ї/' => 'Yi', + '/Ж/' => 'Zh', + '/ж/' => 'zh', + '/Х/' => 'Kh', + '/х/' => 'kh', + '/Ц/' => 'Ts', + '/ц/' => 'ts', + '/Ч/' => 'Ch', + '/ч/' => 'ch', + '/Ш/' => 'Sh', + '/ш/' => 'sh', + '/Щ/' => 'Shch', + '/щ/' => 'shch', + '/Ъ|ъ|Ь|ь/' => '', + '/Ю/' => 'Yu', + '/ю/' => 'yu', + '/Я/' => 'Ya', + '/я/' => 'ya' +); diff --git a/2_services/1_metaverse/nodam/application/config/hooks.php b/2_services/1_metaverse/nodam/application/config/hooks.php new file mode 100644 index 0000000000000000000000000000000000000000..61fbabf08a156124a7988fc9c5b06d94f64a3fd7 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/hooks.php @@ -0,0 +1,26 @@ + '', + 'function' => 'minify_html', + 'filename' => 'minify_html.php', + 'filepath' => 'hooks' +); diff --git a/2_services/1_metaverse/nodam/application/config/index.html b/2_services/1_metaverse/nodam/application/config/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/config/memcached.php b/2_services/1_metaverse/nodam/application/config/memcached.php new file mode 100644 index 0000000000000000000000000000000000000000..55949a66c0822f48fa42a0d3ed2461a163cc64fd --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/memcached.php @@ -0,0 +1,19 @@ + array( + 'hostname' => '127.0.0.1', + 'port' => '11211', + 'weight' => '1', + ), +); diff --git a/2_services/1_metaverse/nodam/application/config/migration.php b/2_services/1_metaverse/nodam/application/config/migration.php new file mode 100644 index 0000000000000000000000000000000000000000..4b585a65c1085b2910acfd90fa8dfcdfb8156b33 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/migration.php @@ -0,0 +1,84 @@ +migration->current() this is the version that schema will +| be upgraded / downgraded to. +| +*/ +$config['migration_version'] = 0; + +/* +|-------------------------------------------------------------------------- +| Migrations Path +|-------------------------------------------------------------------------- +| +| Path to your migrations folder. +| Typically, it will be within your application path. +| Also, writing permission is required within the migrations path. +| +*/ +$config['migration_path'] = APPPATH.'migrations/'; diff --git a/2_services/1_metaverse/nodam/application/config/mimes.php b/2_services/1_metaverse/nodam/application/config/mimes.php new file mode 100644 index 0000000000000000000000000000000000000000..0ec9db0a0bc684b3a0eec1431f4c6b451a30026d --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/mimes.php @@ -0,0 +1,184 @@ + array('application/mac-binhex40', 'application/mac-binhex', 'application/x-binhex40', 'application/x-mac-binhex40'), + 'cpt' => 'application/mac-compactpro', + 'csv' => array('text/x-comma-separated-values', 'text/comma-separated-values', 'application/octet-stream', 'application/vnd.ms-excel', 'application/x-csv', 'text/x-csv', 'text/csv', 'application/csv', 'application/excel', 'application/vnd.msexcel', 'text/plain'), + 'bin' => array('application/macbinary', 'application/mac-binary', 'application/octet-stream', 'application/x-binary', 'application/x-macbinary'), + 'dms' => 'application/octet-stream', + 'lha' => 'application/octet-stream', + 'lzh' => 'application/octet-stream', + 'exe' => array('application/octet-stream', 'application/x-msdownload'), + 'class' => 'application/octet-stream', + 'psd' => array('application/x-photoshop', 'image/vnd.adobe.photoshop'), + 'so' => 'application/octet-stream', + 'sea' => 'application/octet-stream', + 'dll' => 'application/octet-stream', + 'oda' => 'application/oda', + 'pdf' => array('application/pdf', 'application/force-download', 'application/x-download', 'binary/octet-stream'), + 'ai' => array('application/pdf', 'application/postscript'), + 'eps' => 'application/postscript', + 'ps' => 'application/postscript', + 'smi' => 'application/smil', + 'smil' => 'application/smil', + 'mif' => 'application/vnd.mif', + 'xls' => array('application/vnd.ms-excel', 'application/msexcel', 'application/x-msexcel', 'application/x-ms-excel', 'application/x-excel', 'application/x-dos_ms_excel', 'application/xls', 'application/x-xls', 'application/excel', 'application/download', 'application/vnd.ms-office', 'application/msword'), + 'ppt' => array('application/powerpoint', 'application/vnd.ms-powerpoint', 'application/vnd.ms-office', 'application/msword'), + 'pptx' => array('application/vnd.openxmlformats-officedocument.presentationml.presentation', 'application/x-zip', 'application/zip'), + 'wbxml' => 'application/wbxml', + 'wmlc' => 'application/wmlc', + 'dcr' => 'application/x-director', + 'dir' => 'application/x-director', + 'dxr' => 'application/x-director', + 'dvi' => 'application/x-dvi', + 'gtar' => 'application/x-gtar', + 'gz' => 'application/x-gzip', + 'gzip' => 'application/x-gzip', + 'php' => array('application/x-httpd-php', 'application/php', 'application/x-php', 'text/php', 'text/x-php', 'application/x-httpd-php-source'), + 'php4' => 'application/x-httpd-php', + 'php3' => 'application/x-httpd-php', + 'phtml' => 'application/x-httpd-php', + 'phps' => 'application/x-httpd-php-source', + 'js' => array('application/x-javascript', 'text/plain'), + 'swf' => 'application/x-shockwave-flash', + 'sit' => 'application/x-stuffit', + 'tar' => 'application/x-tar', + 'tgz' => array('application/x-tar', 'application/x-gzip-compressed'), + 'z' => 'application/x-compress', + 'xhtml' => 'application/xhtml+xml', + 'xht' => 'application/xhtml+xml', + 'zip' => array('application/x-zip', 'application/zip', 'application/x-zip-compressed', 'application/s-compressed', 'multipart/x-zip'), + 'rar' => array('application/x-rar', 'application/rar', 'application/x-rar-compressed'), + 'mid' => 'audio/midi', + 'midi' => 'audio/midi', + 'mpga' => 'audio/mpeg', + 'mp2' => 'audio/mpeg', + 'mp3' => array('audio/mpeg', 'audio/mpg', 'audio/mpeg3', 'audio/mp3'), + 'aif' => array('audio/x-aiff', 'audio/aiff'), + 'aiff' => array('audio/x-aiff', 'audio/aiff'), + 'aifc' => 'audio/x-aiff', + 'ram' => 'audio/x-pn-realaudio', + 'rm' => 'audio/x-pn-realaudio', + 'rpm' => 'audio/x-pn-realaudio-plugin', + 'ra' => 'audio/x-realaudio', + 'rv' => 'video/vnd.rn-realvideo', + 'wav' => array('audio/x-wav', 'audio/wave', 'audio/wav'), + 'bmp' => array('image/bmp', 'image/x-bmp', 'image/x-bitmap', 'image/x-xbitmap', 'image/x-win-bitmap', 'image/x-windows-bmp', 'image/ms-bmp', 'image/x-ms-bmp', 'application/bmp', 'application/x-bmp', 'application/x-win-bitmap'), + 'gif' => 'image/gif', + 'jpeg' => array('image/jpeg', 'image/pjpeg'), + 'jpg' => array('image/jpeg', 'image/pjpeg'), + 'jpe' => array('image/jpeg', 'image/pjpeg'), + 'jp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'j2k' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpf' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpg2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpx' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'jpm' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mj2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'mjp2' => array('image/jp2', 'video/mj2', 'image/jpx', 'image/jpm'), + 'png' => array('image/png', 'image/x-png'), + 'tiff' => 'image/tiff', + 'tif' => 'image/tiff', + 'css' => array('text/css', 'text/plain'), + 'html' => array('text/html', 'text/plain'), + 'htm' => array('text/html', 'text/plain'), + 'shtml' => array('text/html', 'text/plain'), + 'txt' => 'text/plain', + 'text' => 'text/plain', + 'log' => array('text/plain', 'text/x-log'), + 'rtx' => 'text/richtext', + 'rtf' => 'text/rtf', + 'xml' => array('application/xml', 'text/xml', 'text/plain'), + 'xsl' => array('application/xml', 'text/xsl', 'text/xml'), + 'mpeg' => 'video/mpeg', + 'mpg' => 'video/mpeg', + 'mpe' => 'video/mpeg', + 'qt' => 'video/quicktime', + 'mov' => 'video/quicktime', + 'avi' => array('video/x-msvideo', 'video/msvideo', 'video/avi', 'application/x-troff-msvideo'), + 'movie' => 'video/x-sgi-movie', + 'doc' => array('application/msword', 'application/vnd.ms-office'), + 'docx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword', 'application/x-zip'), + 'dot' => array('application/msword', 'application/vnd.ms-office'), + 'dotx' => array('application/vnd.openxmlformats-officedocument.wordprocessingml.document', 'application/zip', 'application/msword'), + 'xlsx' => array('application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/vnd.ms-excel', 'application/msword', 'application/x-zip'), + 'word' => array('application/msword', 'application/octet-stream'), + 'xl' => 'application/excel', + 'eml' => 'message/rfc822', + 'json' => array('application/json', 'text/json'), + 'pem' => array('application/x-x509-user-cert', 'application/x-pem-file', 'application/octet-stream'), + 'p10' => array('application/x-pkcs10', 'application/pkcs10'), + 'p12' => 'application/x-pkcs12', + 'p7a' => 'application/x-pkcs7-signature', + 'p7c' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'), + 'p7m' => array('application/pkcs7-mime', 'application/x-pkcs7-mime'), + 'p7r' => 'application/x-pkcs7-certreqresp', + 'p7s' => 'application/pkcs7-signature', + 'crt' => array('application/x-x509-ca-cert', 'application/x-x509-user-cert', 'application/pkix-cert'), + 'crl' => array('application/pkix-crl', 'application/pkcs-crl'), + 'der' => 'application/x-x509-ca-cert', + 'kdb' => 'application/octet-stream', + 'pgp' => 'application/pgp', + 'gpg' => 'application/gpg-keys', + 'sst' => 'application/octet-stream', + 'csr' => 'application/octet-stream', + 'rsa' => 'application/x-pkcs7', + 'cer' => array('application/pkix-cert', 'application/x-x509-ca-cert'), + '3g2' => 'video/3gpp2', + '3gp' => array('video/3gp', 'video/3gpp'), + 'mp4' => 'video/mp4', + 'm4a' => 'audio/x-m4a', + 'f4v' => array('video/mp4', 'video/x-f4v'), + 'flv' => 'video/x-flv', + 'webm' => 'video/webm', + 'aac' => 'audio/x-acc', + 'm4u' => 'application/vnd.mpegurl', + 'm3u' => 'text/plain', + 'xspf' => 'application/xspf+xml', + 'vlc' => 'application/videolan', + 'wmv' => array('video/x-ms-wmv', 'video/x-ms-asf'), + 'au' => 'audio/x-au', + 'ac3' => 'audio/ac3', + 'flac' => 'audio/x-flac', + 'ogg' => array('audio/ogg', 'video/ogg', 'application/ogg'), + 'kmz' => array('application/vnd.google-earth.kmz', 'application/zip', 'application/x-zip'), + 'kml' => array('application/vnd.google-earth.kml+xml', 'application/xml', 'text/xml'), + 'ics' => 'text/calendar', + 'ical' => 'text/calendar', + 'zsh' => 'text/x-scriptzsh', + '7z' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'), + '7zip' => array('application/x-7z-compressed', 'application/x-compressed', 'application/x-zip-compressed', 'application/zip', 'multipart/x-zip'), + 'cdr' => array('application/cdr', 'application/coreldraw', 'application/x-cdr', 'application/x-coreldraw', 'image/cdr', 'image/x-cdr', 'zz-application/zz-winassoc-cdr'), + 'wma' => array('audio/x-ms-wma', 'video/x-ms-asf'), + 'jar' => array('application/java-archive', 'application/x-java-application', 'application/x-jar', 'application/x-compressed'), + 'svg' => array('image/svg+xml', 'application/xml', 'text/xml'), + 'vcf' => 'text/x-vcard', + 'srt' => array('text/srt', 'text/plain'), + 'vtt' => array('text/vtt', 'text/plain'), + 'ico' => array('image/x-icon', 'image/x-ico', 'image/vnd.microsoft.icon'), + 'odc' => 'application/vnd.oasis.opendocument.chart', + 'otc' => 'application/vnd.oasis.opendocument.chart-template', + 'odf' => 'application/vnd.oasis.opendocument.formula', + 'otf' => 'application/vnd.oasis.opendocument.formula-template', + 'odg' => 'application/vnd.oasis.opendocument.graphics', + 'otg' => 'application/vnd.oasis.opendocument.graphics-template', + 'odi' => 'application/vnd.oasis.opendocument.image', + 'oti' => 'application/vnd.oasis.opendocument.image-template', + 'odp' => 'application/vnd.oasis.opendocument.presentation', + 'otp' => 'application/vnd.oasis.opendocument.presentation-template', + 'ods' => 'application/vnd.oasis.opendocument.spreadsheet', + 'ots' => 'application/vnd.oasis.opendocument.spreadsheet-template', + 'odt' => 'application/vnd.oasis.opendocument.text', + 'odm' => 'application/vnd.oasis.opendocument.text-master', + 'ott' => 'application/vnd.oasis.opendocument.text-template', + 'oth' => 'application/vnd.oasis.opendocument.text-web' +); diff --git a/2_services/1_metaverse/nodam/application/config/profiler.php b/2_services/1_metaverse/nodam/application/config/profiler.php new file mode 100644 index 0000000000000000000000000000000000000000..b30204e1698fda1eee335ee31c9bfd129ba145b3 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/profiler.php @@ -0,0 +1,14 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/config/routes.php b/2_services/1_metaverse/nodam/application/config/routes.php new file mode 100644 index 0000000000000000000000000000000000000000..3f4e15602eda94a86236b5eef0fc5e49dbcbd7ba --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/routes.php @@ -0,0 +1,58 @@ + my_controller/index +| my-controller/my-method -> my_controller/my_method +*/ +$route['default_controller'] = 'home'; +$route['404_override'] = ''; +$route['translate_uri_dashes'] = FALSE; + +$route['admin'] = 'admin/dashboard'; +$route['admin/prefs/interfaces/(:any)'] = 'admin/prefs/interfaces/$1'; + diff --git a/2_services/1_metaverse/nodam/application/config/smileys.php b/2_services/1_metaverse/nodam/application/config/smileys.php new file mode 100644 index 0000000000000000000000000000000000000000..1eeba4776cbfb1335d8516296e9400793028971a --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/smileys.php @@ -0,0 +1,64 @@ + array('grin.gif', '19', '19', 'grin'), + ':lol:' => array('lol.gif', '19', '19', 'LOL'), + ':cheese:' => array('cheese.gif', '19', '19', 'cheese'), + ':)' => array('smile.gif', '19', '19', 'smile'), + ';-)' => array('wink.gif', '19', '19', 'wink'), + ';)' => array('wink.gif', '19', '19', 'wink'), + ':smirk:' => array('smirk.gif', '19', '19', 'smirk'), + ':roll:' => array('rolleyes.gif', '19', '19', 'rolleyes'), + ':-S' => array('confused.gif', '19', '19', 'confused'), + ':wow:' => array('surprise.gif', '19', '19', 'surprised'), + ':bug:' => array('bigsurprise.gif', '19', '19', 'big surprise'), + ':-P' => array('tongue_laugh.gif', '19', '19', 'tongue laugh'), + '%-P' => array('tongue_rolleye.gif', '19', '19', 'tongue rolleye'), + ';-P' => array('tongue_wink.gif', '19', '19', 'tongue wink'), + ':P' => array('raspberry.gif', '19', '19', 'raspberry'), + ':blank:' => array('blank.gif', '19', '19', 'blank stare'), + ':long:' => array('longface.gif', '19', '19', 'long face'), + ':ohh:' => array('ohh.gif', '19', '19', 'ohh'), + ':grrr:' => array('grrr.gif', '19', '19', 'grrr'), + ':gulp:' => array('gulp.gif', '19', '19', 'gulp'), + '8-/' => array('ohoh.gif', '19', '19', 'oh oh'), + ':down:' => array('downer.gif', '19', '19', 'downer'), + ':red:' => array('embarrassed.gif', '19', '19', 'red face'), + ':sick:' => array('sick.gif', '19', '19', 'sick'), + ':shut:' => array('shuteye.gif', '19', '19', 'shut eye'), + ':-/' => array('hmm.gif', '19', '19', 'hmmm'), + '>:(' => array('mad.gif', '19', '19', 'mad'), + ':mad:' => array('mad.gif', '19', '19', 'mad'), + '>:-(' => array('angry.gif', '19', '19', 'angry'), + ':angry:' => array('angry.gif', '19', '19', 'angry'), + ':zip:' => array('zip.gif', '19', '19', 'zipper'), + ':kiss:' => array('kiss.gif', '19', '19', 'kiss'), + ':ahhh:' => array('shock.gif', '19', '19', 'shock'), + ':coolsmile:' => array('shade_smile.gif', '19', '19', 'cool smile'), + ':coolsmirk:' => array('shade_smirk.gif', '19', '19', 'cool smirk'), + ':coolgrin:' => array('shade_grin.gif', '19', '19', 'cool grin'), + ':coolhmm:' => array('shade_hmm.gif', '19', '19', 'cool hmm'), + ':coolmad:' => array('shade_mad.gif', '19', '19', 'cool mad'), + ':coolcheese:' => array('shade_cheese.gif', '19', '19', 'cool cheese'), + ':vampire:' => array('vampire.gif', '19', '19', 'vampire'), + ':snake:' => array('snake.gif', '19', '19', 'snake'), + ':exclaim:' => array('exclaim.gif', '19', '19', 'exclaim'), + ':question:' => array('question.gif', '19', '19', 'question') + +); diff --git a/2_services/1_metaverse/nodam/application/config/user_agents.php b/2_services/1_metaverse/nodam/application/config/user_agents.php new file mode 100644 index 0000000000000000000000000000000000000000..1129dbacd489d669f3bafa5b2f4c6e5bef7423b8 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/config/user_agents.php @@ -0,0 +1,211 @@ + 'Windows 10', + 'windows nt 6.3' => 'Windows 8.1', + 'windows nt 6.2' => 'Windows 8', + 'windows nt 6.1' => 'Windows 7', + 'windows nt 6.0' => 'Windows Vista', + 'windows nt 5.2' => 'Windows 2003', + 'windows nt 5.1' => 'Windows XP', + 'windows nt 5.0' => 'Windows 2000', + 'windows nt 4.0' => 'Windows NT 4.0', + 'winnt4.0' => 'Windows NT 4.0', + 'winnt 4.0' => 'Windows NT', + 'winnt' => 'Windows NT', + 'windows 98' => 'Windows 98', + 'win98' => 'Windows 98', + 'windows 95' => 'Windows 95', + 'win95' => 'Windows 95', + 'windows phone' => 'Windows Phone', + 'windows' => 'Unknown Windows OS', + 'android' => 'Android', + 'blackberry' => 'BlackBerry', + 'iphone' => 'iOS', + 'ipad' => 'iOS', + 'ipod' => 'iOS', + 'os x' => 'Mac OS X', + 'ppc mac' => 'Power PC Mac', + 'freebsd' => 'FreeBSD', + 'ppc' => 'Macintosh', + 'linux' => 'Linux', + 'debian' => 'Debian', + 'sunos' => 'Sun Solaris', + 'beos' => 'BeOS', + 'apachebench' => 'ApacheBench', + 'aix' => 'AIX', + 'irix' => 'Irix', + 'osf' => 'DEC OSF', + 'hp-ux' => 'HP-UX', + 'netbsd' => 'NetBSD', + 'bsdi' => 'BSDi', + 'openbsd' => 'OpenBSD', + 'gnu' => 'GNU/Linux', + 'unix' => 'Unknown Unix OS', + 'symbian' => 'Symbian OS' +); + + +// The order of this array should NOT be changed. Many browsers return +// multiple browser types so we want to identify the sub-type first. +$browsers = array( + 'OPR' => 'Opera', + 'Flock' => 'Flock', + 'Edge' => 'Spartan', + 'Chrome' => 'Chrome', + // Opera 10+ always reports Opera/9.80 and appends Version/ to the user agent string + 'Opera.*?Version' => 'Opera', + 'Opera' => 'Opera', + 'MSIE' => 'Internet Explorer', + 'Internet Explorer' => 'Internet Explorer', + 'Trident.* rv' => 'Internet Explorer', + 'Shiira' => 'Shiira', + 'Firefox' => 'Firefox', + 'Chimera' => 'Chimera', + 'Phoenix' => 'Phoenix', + 'Firebird' => 'Firebird', + 'Camino' => 'Camino', + 'Netscape' => 'Netscape', + 'OmniWeb' => 'OmniWeb', + 'Safari' => 'Safari', + 'Mozilla' => 'Mozilla', + 'Konqueror' => 'Konqueror', + 'icab' => 'iCab', + 'Lynx' => 'Lynx', + 'Links' => 'Links', + 'hotjava' => 'HotJava', + 'amaya' => 'Amaya', + 'IBrowse' => 'IBrowse', + 'Maxthon' => 'Maxthon', + 'Ubuntu' => 'Ubuntu Web Browser' +); + +$mobiles = array( + // legacy array, old values commented out + 'mobileexplorer' => 'Mobile Explorer', +// 'openwave' => 'Open Wave', +// 'opera mini' => 'Opera Mini', +// 'operamini' => 'Opera Mini', +// 'elaine' => 'Palm', + 'palmsource' => 'Palm', +// 'digital paths' => 'Palm', +// 'avantgo' => 'Avantgo', +// 'xiino' => 'Xiino', + 'palmscape' => 'Palmscape', +// 'nokia' => 'Nokia', +// 'ericsson' => 'Ericsson', +// 'blackberry' => 'BlackBerry', +// 'motorola' => 'Motorola' + + // Phones and Manufacturers + 'motorola' => 'Motorola', + 'nokia' => 'Nokia', + 'palm' => 'Palm', + 'iphone' => 'Apple iPhone', + 'ipad' => 'iPad', + 'ipod' => 'Apple iPod Touch', + 'sony' => 'Sony Ericsson', + 'ericsson' => 'Sony Ericsson', + 'blackberry' => 'BlackBerry', + 'cocoon' => 'O2 Cocoon', + 'blazer' => 'Treo', + 'lg' => 'LG', + 'amoi' => 'Amoi', + 'xda' => 'XDA', + 'mda' => 'MDA', + 'vario' => 'Vario', + 'htc' => 'HTC', + 'samsung' => 'Samsung', + 'sharp' => 'Sharp', + 'sie-' => 'Siemens', + 'alcatel' => 'Alcatel', + 'benq' => 'BenQ', + 'ipaq' => 'HP iPaq', + 'mot-' => 'Motorola', + 'playstation portable' => 'PlayStation Portable', + 'playstation 3' => 'PlayStation 3', + 'playstation vita' => 'PlayStation Vita', + 'hiptop' => 'Danger Hiptop', + 'nec-' => 'NEC', + 'panasonic' => 'Panasonic', + 'philips' => 'Philips', + 'sagem' => 'Sagem', + 'sanyo' => 'Sanyo', + 'spv' => 'SPV', + 'zte' => 'ZTE', + 'sendo' => 'Sendo', + 'nintendo dsi' => 'Nintendo DSi', + 'nintendo ds' => 'Nintendo DS', + 'nintendo 3ds' => 'Nintendo 3DS', + 'wii' => 'Nintendo Wii', + 'open web' => 'Open Web', + 'openweb' => 'OpenWeb', + + // Operating Systems + 'android' => 'Android', + 'symbian' => 'Symbian', + 'SymbianOS' => 'SymbianOS', + 'elaine' => 'Palm', + 'series60' => 'Symbian S60', + 'windows ce' => 'Windows CE', + + // Browsers + 'obigo' => 'Obigo', + 'netfront' => 'Netfront Browser', + 'openwave' => 'Openwave Browser', + 'mobilexplorer' => 'Mobile Explorer', + 'operamini' => 'Opera Mini', + 'opera mini' => 'Opera Mini', + 'opera mobi' => 'Opera Mobile', + 'fennec' => 'Firefox Mobile', + + // Other + 'digital paths' => 'Digital Paths', + 'avantgo' => 'AvantGo', + 'xiino' => 'Xiino', + 'novarra' => 'Novarra Transcoder', + 'vodafone' => 'Vodafone', + 'docomo' => 'NTT DoCoMo', + 'o2' => 'O2', + + // Fallback + 'mobile' => 'Generic Mobile', + 'wireless' => 'Generic Mobile', + 'j2me' => 'Generic Mobile', + 'midp' => 'Generic Mobile', + 'cldc' => 'Generic Mobile', + 'up.link' => 'Generic Mobile', + 'up.browser' => 'Generic Mobile', + 'smartphone' => 'Generic Mobile', + 'cellphone' => 'Generic Mobile' +); + +// There are hundreds of bots but these are the most common. +$robots = array( + 'googlebot' => 'Googlebot', + 'msnbot' => 'MSNBot', + 'baiduspider' => 'Baiduspider', + 'bingbot' => 'Bing', + 'slurp' => 'Inktomi Slurp', + 'yahoo' => 'Yahoo', + 'ask jeeves' => 'Ask Jeeves', + 'fastcrawler' => 'FastCrawler', + 'infoseek' => 'InfoSeek Robot 1.0', + 'lycos' => 'Lycos', + 'yandex' => 'YandexBot', + 'mediapartners-google' => 'MediaPartners Google', + 'CRAZYWEBCRAWLER' => 'Crazy Webcrawler', + 'adsbot-google' => 'AdsBot Google', + 'feedfetcher-google' => 'Feedfetcher Google', + 'curious george' => 'Curious George' +); diff --git a/2_services/1_metaverse/nodam/application/controllers/Auth.php b/2_services/1_metaverse/nodam/application/controllers/Auth.php new file mode 100644 index 0000000000000000000000000000000000000000..92a5e6d89d7a2df96700790b86a86f0aa1f0c744 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/Auth.php @@ -0,0 +1,94 @@ +form_validation->set_error_delimiters($this->config->item('error_start_delimiter', 'ion_auth'), $this->config->item('error_end_delimiter', 'ion_auth')); + $this->lang->load('auth'); + } + + + function index(){ + if ( ! $this->ion_auth->logged_in()){ + redirect('auth/login', 'refresh'); + }else{ + redirect('/', 'refresh'); + } + } + + function login(){ + if ( ! $this->ion_auth->logged_in()){ + /* Load */ + $this->load->config('admin/dp_config'); + $this->load->config('common/dp_config'); + $this->load->model('admin/user_model'); + + /* Valid form */ + $this->form_validation->set_rules('identity', 'Identity', 'required'); + $this->form_validation->set_rules('password', 'Password', 'required'); + + /* Data */ + $this->data['title'] = $this->config->item('title'); + $this->data['title_lg'] = $this->config->item('title_lg'); + $this->data['auth_social_network'] = $this->config->item('auth_social_network'); + $this->data['forgot_password'] = $this->config->item('forgot_password'); + $this->data['new_membership'] = $this->config->item('new_membership'); + + if ($this->form_validation->run() == TRUE){ + if($this->user_model->login($this->input->post('identity'), $this->input->post('password')) == TRUE){ + $this->ion_auth->is_admin(); + $this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message'); + $this->session->set_userdata('id', $this->input->post('identity')); + $this->session->set_userdata('identity', $this->input->post('identity')); + //$this->template->auth_render('auth/choice', $this->data); + redirect('admin', 'refresh'); + }else{ + $this->session->set_flashdata('message', '존재하지 않는 회원 정보입니다.'); + redirect('auth/login', 'refresh'); + } + }else{ + $this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message'); + $this->data['identity'] = array( + 'name' => 'identity', + 'id' => 'identity', + 'type' => 'email', + 'value' => $this->form_validation->set_value('identity'), + 'class' => 'form-control', + 'placeholder' => lang('auth_your_email') + ); + $this->data['password'] = array( + 'name' => 'password', + 'id' => 'password', + 'type' => 'password', + 'class' => 'form-control', + 'placeholder' => lang('auth_your_password') + ); + $this->template->auth_render('auth/login', $this->data); + } + }else{ + redirect('/', 'refresh'); + } + } + + + function logout($src = NULL) + { + $logout = $this->ion_auth->logout(); + + $this->session->set_flashdata('message', $this->ion_auth->messages()); + + if ($src == 'admin') + { + redirect('auth/login', 'refresh'); + } + else + { + redirect('/', 'refresh'); + } + } + +} diff --git a/2_services/1_metaverse/nodam/application/controllers/Auth_original.php b/2_services/1_metaverse/nodam/application/controllers/Auth_original.php new file mode 100644 index 0000000000000000000000000000000000000000..826f4c81c0be6460abad9c19725b8d089232d1cf --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/Auth_original.php @@ -0,0 +1,802 @@ +load->database(); + $this->load->library(array('ion_auth','form_validation')); + $this->load->helper(array('url','language')); + + $this->form_validation->set_error_delimiters($this->config->item('error_start_delimiter', 'ion_auth'), $this->config->item('error_end_delimiter', 'ion_auth')); + + $this->lang->load('auth'); + } + + // redirect if needed, otherwise display the user list + function index() + { + + if (!$this->ion_auth->logged_in()) + { + // redirect them to the login page + redirect('auth/login', 'refresh'); + } + elseif (!$this->ion_auth->is_admin()) // remove this elseif if you want to enable this for non-admins + { + // redirect them to the home page because they must be an administrator to view this + return show_error('You must be an administrator to view this page.'); + } + else + { + // set the flash data error message if there is one + $this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message'); + + //list the users + $this->data['users'] = $this->ion_auth->users()->result(); + foreach ($this->data['users'] as $k => $user) + { + $this->data['users'][$k]->groups = $this->ion_auth->get_users_groups($user->id)->result(); + } + + $this->_render_page('auth/index', $this->data); + } + } + + // log the user in + function login() + { + $this->data['title'] = "Login"; + + //validate form input + $this->form_validation->set_rules('identity', 'Identity', 'required'); + $this->form_validation->set_rules('password', 'Password', 'required'); + + if ($this->form_validation->run() == true) + { + // check to see if the user is logging in + // check for "remember me" + $remember = (bool) $this->input->post('remember'); + + if ($this->ion_auth->login($this->input->post('identity'), $this->input->post('password'), $remember)) + { + //if the login is successful + //redirect them back to the home page + $this->session->set_flashdata('message', $this->ion_auth->messages()); + redirect('/', 'refresh'); + } + else + { + // if the login was un-successful + // redirect them back to the login page + $this->session->set_flashdata('message', $this->ion_auth->errors()); + redirect('auth/login', 'refresh'); // use redirects instead of loading views for compatibility with MY_Controller libraries + } + } + else + { + // the user is not logging in so display the login page + // set the flash data error message if there is one + $this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message'); + + $this->data['identity'] = array('name' => 'identity', + 'id' => 'identity', + 'type' => 'text', + 'value' => $this->form_validation->set_value('identity'), + ); + $this->data['password'] = array('name' => 'password', + 'id' => 'password', + 'type' => 'password', + ); + + $this->_render_page('auth/login', $this->data); + } + } + + // log the user out + function logout() + { + $this->data['title'] = "Logout"; + + // log the user out + $logout = $this->ion_auth->logout(); + + // redirect them to the login page + $this->session->set_flashdata('message', $this->ion_auth->messages()); + redirect('auth/login', 'refresh'); + } + + // change password + function change_password() + { + $this->form_validation->set_rules('old', $this->lang->line('change_password_validation_old_password_label'), 'required'); + $this->form_validation->set_rules('new', $this->lang->line('change_password_validation_new_password_label'), 'required|min_length[' . $this->config->item('min_password_length', 'ion_auth') . ']|max_length[' . $this->config->item('max_password_length', 'ion_auth') . ']|matches[new_confirm]'); + $this->form_validation->set_rules('new_confirm', $this->lang->line('change_password_validation_new_password_confirm_label'), 'required'); + + if (!$this->ion_auth->logged_in()) + { + redirect('auth/login', 'refresh'); + } + + $user = $this->ion_auth->user()->row(); + + if ($this->form_validation->run() == false) + { + // display the form + // set the flash data error message if there is one + $this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message'); + + $this->data['min_password_length'] = $this->config->item('min_password_length', 'ion_auth'); + $this->data['old_password'] = array( + 'name' => 'old', + 'id' => 'old', + 'type' => 'password', + ); + $this->data['new_password'] = array( + 'name' => 'new', + 'id' => 'new', + 'type' => 'password', + 'pattern' => '^.{'.$this->data['min_password_length'].'}.*$', + ); + $this->data['new_password_confirm'] = array( + 'name' => 'new_confirm', + 'id' => 'new_confirm', + 'type' => 'password', + 'pattern' => '^.{'.$this->data['min_password_length'].'}.*$', + ); + $this->data['user_id'] = array( + 'name' => 'user_id', + 'id' => 'user_id', + 'type' => 'hidden', + 'value' => $user->id, + ); + + // render + $this->_render_page('auth/change_password', $this->data); + } + else + { + $identity = $this->session->userdata('identity'); + + $change = $this->ion_auth->change_password($identity, $this->input->post('old'), $this->input->post('new')); + + if ($change) + { + //if the password was successfully changed + $this->session->set_flashdata('message', $this->ion_auth->messages()); + $this->logout(); + } + else + { + $this->session->set_flashdata('message', $this->ion_auth->errors()); + redirect('auth/change_password', 'refresh'); + } + } + } + + // forgot password + function forgot_password() + { + // setting validation rules by checking wheather identity is username or email + if($this->config->item('identity', 'ion_auth') != 'email' ) + { + $this->form_validation->set_rules('identity', $this->lang->line('forgot_password_identity_label'), 'required'); + } + else + { + $this->form_validation->set_rules('email', $this->lang->line('forgot_password_validation_email_label'), 'required|valid_email'); + } + + + if ($this->form_validation->run() == false) + { + // setup the input + $this->data['email'] = array('name' => 'email', + 'id' => 'email', + ); + + if ( $this->config->item('identity', 'ion_auth') != 'email' ){ + $this->data['identity_label'] = $this->lang->line('forgot_password_identity_label'); + } + else + { + $this->data['identity_label'] = $this->lang->line('forgot_password_email_identity_label'); + } + + // set any errors and display the form + $this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message'); + $this->_render_page('auth/forgot_password', $this->data); + } + else + { + $identity_column = $this->config->item('identity','ion_auth'); + $identity = $this->ion_auth->where($identity_column, $this->input->post('email'))->users()->row(); + + if(empty($identity)) { + + if($this->config->item('identity', 'ion_auth') != 'email') + { + $this->ion_auth->set_error('forgot_password_identity_not_found'); + } + else + { + $this->ion_auth->set_error('forgot_password_email_not_found'); + } + + $this->session->set_flashdata('message', $this->ion_auth->errors()); + redirect("auth/forgot_password", 'refresh'); + } + + // run the forgotten password method to email an activation code to the user + $forgotten = $this->ion_auth->forgotten_password($identity->{$this->config->item('identity', 'ion_auth')}); + + if ($forgotten) + { + // if there were no errors + $this->session->set_flashdata('message', $this->ion_auth->messages()); + redirect("auth/login", 'refresh'); //we should display a confirmation page here instead of the login page + } + else + { + $this->session->set_flashdata('message', $this->ion_auth->errors()); + redirect("auth/forgot_password", 'refresh'); + } + } + } + + // reset password - final step for forgotten password + public function reset_password($code = NULL) + { + if (!$code) + { + show_404(); + } + + $user = $this->ion_auth->forgotten_password_check($code); + + if ($user) + { + // if the code is valid then display the password reset form + + $this->form_validation->set_rules('new', $this->lang->line('reset_password_validation_new_password_label'), 'required|min_length[' . $this->config->item('min_password_length', 'ion_auth') . ']|max_length[' . $this->config->item('max_password_length', 'ion_auth') . ']|matches[new_confirm]'); + $this->form_validation->set_rules('new_confirm', $this->lang->line('reset_password_validation_new_password_confirm_label'), 'required'); + + if ($this->form_validation->run() == false) + { + // display the form + + // set the flash data error message if there is one + $this->data['message'] = (validation_errors()) ? validation_errors() : $this->session->flashdata('message'); + + $this->data['min_password_length'] = $this->config->item('min_password_length', 'ion_auth'); + $this->data['new_password'] = array( + 'name' => 'new', + 'id' => 'new', + 'type' => 'password', + 'pattern' => '^.{'.$this->data['min_password_length'].'}.*$', + ); + $this->data['new_password_confirm'] = array( + 'name' => 'new_confirm', + 'id' => 'new_confirm', + 'type' => 'password', + 'pattern' => '^.{'.$this->data['min_password_length'].'}.*$', + ); + $this->data['user_id'] = array( + 'name' => 'user_id', + 'id' => 'user_id', + 'type' => 'hidden', + 'value' => $user->id, + ); + $this->data['csrf'] = $this->_get_csrf_nonce(); + $this->data['code'] = $code; + + // render + $this->_render_page('auth/reset_password', $this->data); + } + else + { + // do we have a valid request? + if ($this->_valid_csrf_nonce() === FALSE || $user->id != $this->input->post('user_id')) + { + + // something fishy might be up + $this->ion_auth->clear_forgotten_password_code($code); + + show_error($this->lang->line('error_csrf')); + + } + else + { + // finally change the password + $identity = $user->{$this->config->item('identity', 'ion_auth')}; + + $change = $this->ion_auth->reset_password($identity, $this->input->post('new')); + + if ($change) + { + // if the password was successfully changed + $this->session->set_flashdata('message', $this->ion_auth->messages()); + redirect("auth/login", 'refresh'); + } + else + { + $this->session->set_flashdata('message', $this->ion_auth->errors()); + redirect('auth/reset_password/' . $code, 'refresh'); + } + } + } + } + else + { + // if the code is invalid then send them back to the forgot password page + $this->session->set_flashdata('message', $this->ion_auth->errors()); + redirect("auth/forgot_password", 'refresh'); + } + } + + + // activate the user + function activate($id, $code=false) + { + if ($code !== false) + { + $activation = $this->ion_auth->activate($id, $code); + } + else if ($this->ion_auth->is_admin()) + { + $activation = $this->ion_auth->activate($id); + } + + if ($activation) + { + // redirect them to the auth page + $this->session->set_flashdata('message', $this->ion_auth->messages()); + redirect("auth", 'refresh'); + } + else + { + // redirect them to the forgot password page + $this->session->set_flashdata('message', $this->ion_auth->errors()); + redirect("auth/forgot_password", 'refresh'); + } + } + + // deactivate the user + function deactivate($id = NULL) + { + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()) + { + // redirect them to the home page because they must be an administrator to view this + return show_error('You must be an administrator to view this page.'); + } + + $id = (int) $id; + + $this->load->library('form_validation'); + $this->form_validation->set_rules('confirm', $this->lang->line('deactivate_validation_confirm_label'), 'required'); + $this->form_validation->set_rules('id', $this->lang->line('deactivate_validation_user_id_label'), 'required|alpha_numeric'); + + if ($this->form_validation->run() == FALSE) + { + // insert csrf check + $this->data['csrf'] = $this->_get_csrf_nonce(); + $this->data['user'] = $this->ion_auth->user($id)->row(); + + $this->_render_page('auth/deactivate_user', $this->data); + } + else + { + // do we really want to deactivate? + if ($this->input->post('confirm') == 'yes') + { + // do we have a valid request? + if ($this->_valid_csrf_nonce() === FALSE || $id != $this->input->post('id')) + { + show_error($this->lang->line('error_csrf')); + } + + // do we have the right userlevel? + if ($this->ion_auth->logged_in() && $this->ion_auth->is_admin()) + { + $this->ion_auth->deactivate($id); + } + } + + // redirect them back to the auth page + redirect('auth', 'refresh'); + } + } + + // create a new user + function create_user() + { + $this->data['title'] = "Create User"; + + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()) + { + redirect('auth', 'refresh'); + } + + $tables = $this->config->item('tables','ion_auth'); + + // validate form input + $this->form_validation->set_rules('first_name', $this->lang->line('create_user_validation_fname_label'), 'required'); + $this->form_validation->set_rules('last_name', $this->lang->line('create_user_validation_lname_label'), 'required'); + $this->form_validation->set_rules('email', $this->lang->line('create_user_validation_email_label'), 'required|valid_email|is_unique['.$tables['users'].'.email]'); + $this->form_validation->set_rules('phone', $this->lang->line('create_user_validation_phone_label'), 'required'); + $this->form_validation->set_rules('company', $this->lang->line('create_user_validation_company_label'), 'required'); + $this->form_validation->set_rules('password', $this->lang->line('create_user_validation_password_label'), 'required|min_length[' . $this->config->item('min_password_length', 'ion_auth') . ']|max_length[' . $this->config->item('max_password_length', 'ion_auth') . ']|matches[password_confirm]'); + $this->form_validation->set_rules('password_confirm', $this->lang->line('create_user_validation_password_confirm_label'), 'required'); + + if ($this->form_validation->run() == true) + { + $username = strtolower($this->input->post('first_name')) . ' ' . strtolower($this->input->post('last_name')); + $email = strtolower($this->input->post('email')); + $password = $this->input->post('password'); + + $additional_data = array( + 'first_name' => $this->input->post('first_name'), + 'last_name' => $this->input->post('last_name'), + 'company' => $this->input->post('company'), + 'phone' => $this->input->post('phone'), + ); + } + if ($this->form_validation->run() == true && $this->ion_auth->register($username, $password, $email, $additional_data)) + { + // check to see if we are creating the user + // redirect them back to the admin page + $this->session->set_flashdata('message', $this->ion_auth->messages()); + redirect("auth", 'refresh'); + } + else + { + // display the create user form + // set the flash data error message if there is one + $this->data['message'] = (validation_errors() ? validation_errors() : ($this->ion_auth->errors() ? $this->ion_auth->errors() : $this->session->flashdata('message'))); + + $this->data['first_name'] = array( + 'name' => 'first_name', + 'id' => 'first_name', + 'type' => 'text', + 'value' => $this->form_validation->set_value('first_name'), + ); + $this->data['last_name'] = array( + 'name' => 'last_name', + 'id' => 'last_name', + 'type' => 'text', + 'value' => $this->form_validation->set_value('last_name'), + ); + $this->data['email'] = array( + 'name' => 'email', + 'id' => 'email', + 'type' => 'text', + 'value' => $this->form_validation->set_value('email'), + ); + $this->data['company'] = array( + 'name' => 'company', + 'id' => 'company', + 'type' => 'text', + 'value' => $this->form_validation->set_value('company'), + ); + $this->data['phone'] = array( + 'name' => 'phone', + 'id' => 'phone', + 'type' => 'text', + 'value' => $this->form_validation->set_value('phone'), + ); + $this->data['password'] = array( + 'name' => 'password', + 'id' => 'password', + 'type' => 'password', + 'value' => $this->form_validation->set_value('password'), + ); + $this->data['password_confirm'] = array( + 'name' => 'password_confirm', + 'id' => 'password_confirm', + 'type' => 'password', + 'value' => $this->form_validation->set_value('password_confirm'), + ); + + $this->_render_page('auth/create_user', $this->data); + } + } + + // edit a user + function edit_user($id) + { + $this->data['title'] = "Edit User"; + + if (!$this->ion_auth->logged_in() || (!$this->ion_auth->is_admin() && !($this->ion_auth->user()->row()->id == $id))) + { + redirect('auth', 'refresh'); + } + + $user = $this->ion_auth->user($id)->row(); + $groups=$this->ion_auth->groups()->result_array(); + $currentGroups = $this->ion_auth->get_users_groups($id)->result(); + + // validate form input + $this->form_validation->set_rules('first_name', $this->lang->line('edit_user_validation_fname_label'), 'required'); + $this->form_validation->set_rules('last_name', $this->lang->line('edit_user_validation_lname_label'), 'required'); + $this->form_validation->set_rules('phone', $this->lang->line('edit_user_validation_phone_label'), 'required'); + $this->form_validation->set_rules('company', $this->lang->line('edit_user_validation_company_label'), 'required'); + + if (isset($_POST) && !empty($_POST)) + { + // do we have a valid request? + if ($this->_valid_csrf_nonce() === FALSE || $id != $this->input->post('id')) + { + show_error($this->lang->line('error_csrf')); + } + + // update the password if it was posted + if ($this->input->post('password')) + { + $this->form_validation->set_rules('password', $this->lang->line('edit_user_validation_password_label'), 'required|min_length[' . $this->config->item('min_password_length', 'ion_auth') . ']|max_length[' . $this->config->item('max_password_length', 'ion_auth') . ']|matches[password_confirm]'); + $this->form_validation->set_rules('password_confirm', $this->lang->line('edit_user_validation_password_confirm_label'), 'required'); + } + + if ($this->form_validation->run() === TRUE) + { + $data = array( + 'first_name' => $this->input->post('first_name'), + 'last_name' => $this->input->post('last_name'), + 'company' => $this->input->post('company'), + 'phone' => $this->input->post('phone'), + ); + + // update the password if it was posted + if ($this->input->post('password')) + { + $data['password'] = $this->input->post('password'); + } + + + + // Only allow updating groups if user is admin + if ($this->ion_auth->is_admin()) + { + //Update the groups user belongs to + $groupData = $this->input->post('groups'); + + if (isset($groupData) && !empty($groupData)) { + + $this->ion_auth->remove_from_group('', $id); + + foreach ($groupData as $grp) { + $this->ion_auth->add_to_group($grp, $id); + } + + } + } + + // check to see if we are updating the user + if($this->ion_auth->update($user->id, $data)) + { + // redirect them back to the admin page if admin, or to the base url if non admin + $this->session->set_flashdata('message', $this->ion_auth->messages() ); + if ($this->ion_auth->is_admin()) + { + redirect('auth', 'refresh'); + } + else + { + redirect('/', 'refresh'); + } + + } + else + { + // redirect them back to the admin page if admin, or to the base url if non admin + $this->session->set_flashdata('message', $this->ion_auth->errors() ); + if ($this->ion_auth->is_admin()) + { + redirect('auth', 'refresh'); + } + else + { + redirect('/', 'refresh'); + } + + } + + } + } + + // display the edit user form + $this->data['csrf'] = $this->_get_csrf_nonce(); + + // set the flash data error message if there is one + $this->data['message'] = (validation_errors() ? validation_errors() : ($this->ion_auth->errors() ? $this->ion_auth->errors() : $this->session->flashdata('message'))); + + // pass the user to the view + $this->data['user'] = $user; + $this->data['groups'] = $groups; + $this->data['currentGroups'] = $currentGroups; + + $this->data['first_name'] = array( + 'name' => 'first_name', + 'id' => 'first_name', + 'type' => 'text', + 'value' => $this->form_validation->set_value('first_name', $user->first_name), + ); + $this->data['last_name'] = array( + 'name' => 'last_name', + 'id' => 'last_name', + 'type' => 'text', + 'value' => $this->form_validation->set_value('last_name', $user->last_name), + ); + $this->data['company'] = array( + 'name' => 'company', + 'id' => 'company', + 'type' => 'text', + 'value' => $this->form_validation->set_value('company', $user->company), + ); + $this->data['phone'] = array( + 'name' => 'phone', + 'id' => 'phone', + 'type' => 'text', + 'value' => $this->form_validation->set_value('phone', $user->phone), + ); + $this->data['password'] = array( + 'name' => 'password', + 'id' => 'password', + 'type' => 'password' + ); + $this->data['password_confirm'] = array( + 'name' => 'password_confirm', + 'id' => 'password_confirm', + 'type' => 'password' + ); + + $this->_render_page('auth/edit_user', $this->data); + } + + // create a new group + function create_group() + { + $this->data['title'] = $this->lang->line('create_group_title'); + + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()) + { + redirect('auth', 'refresh'); + } + + // validate form input + $this->form_validation->set_rules('group_name', $this->lang->line('create_group_validation_name_label'), 'required|alpha_dash'); + + if ($this->form_validation->run() == TRUE) + { + $new_group_id = $this->ion_auth->create_group($this->input->post('group_name'), $this->input->post('description')); + if($new_group_id) + { + // check to see if we are creating the group + // redirect them back to the admin page + $this->session->set_flashdata('message', $this->ion_auth->messages()); + redirect("auth", 'refresh'); + } + } + else + { + // display the create group form + // set the flash data error message if there is one + $this->data['message'] = (validation_errors() ? validation_errors() : ($this->ion_auth->errors() ? $this->ion_auth->errors() : $this->session->flashdata('message'))); + + $this->data['group_name'] = array( + 'name' => 'group_name', + 'id' => 'group_name', + 'type' => 'text', + 'value' => $this->form_validation->set_value('group_name'), + ); + $this->data['description'] = array( + 'name' => 'description', + 'id' => 'description', + 'type' => 'text', + 'value' => $this->form_validation->set_value('description'), + ); + + $this->_render_page('auth/create_group', $this->data); + } + } + + // edit a group + function edit_group($id) + { + // bail if no group id given + if(!$id || empty($id)) + { + redirect('auth', 'refresh'); + } + + $this->data['title'] = $this->lang->line('edit_group_title'); + + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()) + { + redirect('auth', 'refresh'); + } + + $group = $this->ion_auth->group($id)->row(); + + // validate form input + $this->form_validation->set_rules('group_name', $this->lang->line('edit_group_validation_name_label'), 'required|alpha_dash'); + + if (isset($_POST) && !empty($_POST)) + { + if ($this->form_validation->run() === TRUE) + { + $group_update = $this->ion_auth->update_group($id, $_POST['group_name'], $_POST['group_description']); + + if($group_update) + { + $this->session->set_flashdata('message', $this->lang->line('edit_group_saved')); + } + else + { + $this->session->set_flashdata('message', $this->ion_auth->errors()); + } + redirect("auth", 'refresh'); + } + } + + // set the flash data error message if there is one + $this->data['message'] = (validation_errors() ? validation_errors() : ($this->ion_auth->errors() ? $this->ion_auth->errors() : $this->session->flashdata('message'))); + + // pass the user to the view + $this->data['group'] = $group; + + $readonly = $this->config->item('admin_group', 'ion_auth') === $group->name ? 'readonly' : ''; + + $this->data['group_name'] = array( + 'name' => 'group_name', + 'id' => 'group_name', + 'type' => 'text', + 'value' => $this->form_validation->set_value('group_name', $group->name), + $readonly => $readonly, + ); + $this->data['group_description'] = array( + 'name' => 'group_description', + 'id' => 'group_description', + 'type' => 'text', + 'value' => $this->form_validation->set_value('group_description', $group->description), + ); + + $this->_render_page('auth/edit_group', $this->data); + } + + + function _get_csrf_nonce() + { + $this->load->helper('string'); + $key = random_string('alnum', 8); + $value = random_string('alnum', 20); + $this->session->set_flashdata('csrfkey', $key); + $this->session->set_flashdata('csrfvalue', $value); + + return array($key => $value); + } + + function _valid_csrf_nonce() + { + if ($this->input->post($this->session->flashdata('csrfkey')) !== FALSE && + $this->input->post($this->session->flashdata('csrfkey')) == $this->session->flashdata('csrfvalue')) + { + return TRUE; + } + else + { + return FALSE; + } + } + + function _render_page($view, $data=null, $returnhtml=false)//I think this makes more sense + { + + $this->viewdata = (empty($data)) ? $this->data: $data; + + $view_html = $this->load->view($view, $this->viewdata, $returnhtml); + + if ($returnhtml) return $view_html;//This will return html on 3rd argument being true + } + +} diff --git a/2_services/1_metaverse/nodam/application/controllers/Home.php b/2_services/1_metaverse/nodam/application/controllers/Home.php new file mode 100644 index 0000000000000000000000000000000000000000..1fc4506cded586857d53ab6f160e716b9ae437b9 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/Home.php @@ -0,0 +1,16 @@ +load->view('public/home', $this->data); + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/_Original.php b/2_services/1_metaverse/nodam/application/controllers/_Original.php new file mode 100644 index 0000000000000000000000000000000000000000..621ea56477513434cdb2847c1a98126f4b7b9a85 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/_Original.php @@ -0,0 +1,16 @@ +load->view('public/home'); + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Dashboard.php b/2_services/1_metaverse/nodam/application/controllers/admin/Dashboard.php new file mode 100644 index 0000000000000000000000000000000000000000..360a5835a8a397add33b70ff6e529ef5e492f12d --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Dashboard.php @@ -0,0 +1,22 @@ +load->helper('number'); + $this->load->model('admin/dashboard_model'); + } + + public function index(){ + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()){ + redirect('auth/login', 'refresh'); + }else{ + $this->page_title->push(lang('menu_dashboard')); + $this->data['pagetitle'] = $this->page_title->show(); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + $this->template->admin_render('admin/dashboard/index', $this->data); + } + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Database.php b/2_services/1_metaverse/nodam/application/controllers/admin/Database.php new file mode 100644 index 0000000000000000000000000000000000000000..77312a7728fbd1839495fcbcfc0b066e76030b28 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Database.php @@ -0,0 +1,42 @@ +load->dbutil(); + $this->lang->load('admin/database'); + + /* Title Page :: Common */ + $this->page_title->push(lang('menu_database_utility')); + $this->data['pagetitle'] = $this->page_title->show(); + + /* Breadcrumbs :: Common */ + $this->breadcrumbs->unshift(1, lang('menu_database_utility'), 'admin/database'); + } + + + public function index() + { + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin()) + { + redirect('auth/login', 'refresh'); + } + else + { + /* Breadcrumbs */ + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + + /* Data */ + $this->data['list_tables'] = $this->db->list_tables(); + $this->data['platform'] = $this->db->platform(); + $this->data['version'] = $this->db->version(); + + /* Load Template */ + $this->template->admin_render('admin/database/index', $this->data); + } + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Files.php b/2_services/1_metaverse/nodam/application/controllers/admin/Files.php new file mode 100644 index 0000000000000000000000000000000000000000..e3a2a55e9afa8f51040d126db7363956d353454d --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Files.php @@ -0,0 +1,79 @@ +page_title->push(lang('menu_files')); + $this->data['pagetitle'] = $this->page_title->show(); + + /* Breadcrumbs :: Common */ + $this->breadcrumbs->unshift(1, lang('menu_files'), 'admin/files'); + } + + + public function index() + { + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin()) + { + redirect('auth/login', 'refresh'); + } + else + { + /* Breadcrumbs */ + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + + /* Data */ + $this->data['error'] = NULL; + + /* Load Template */ + $this->template->admin_render('admin/files/index', $this->data); + } + } + + + public function do_upload() + { + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin()) + { + redirect('auth/login', 'refresh'); + } + else + { + /* Conf */ + $config['upload_path'] = './upload/'; + $config['allowed_types'] = 'gif|jpg|png'; + $config['max_size'] = 2048; + $config['max_width'] = 1024; + $config['max_height'] = 1024; + $config['file_ext_tolower'] = TRUE; + + $this->load->library('upload', $config); + + /* Breadcrumbs */ + $this->breadcrumbs->unshift(2, lang('menu_files'), 'admin/files'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + + if ( ! $this->upload->do_upload('userfile')) + { + /* Data */ + $this->data['error'] = $this->upload->display_errors(); + + /* Load Template */ + $this->template->admin_render('admin/files/index', $this->data); + } + else + { + /* Data */ + $this->data['upload_data'] = $this->upload->data(); + + /* Load Template */ + $this->template->admin_render('admin/files/upload', $this->data); + } + } + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Fwords.php b/2_services/1_metaverse/nodam/application/controllers/admin/Fwords.php new file mode 100644 index 0000000000000000000000000000000000000000..976efecbfd861929a97feb3d6dc4905347f81103 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Fwords.php @@ -0,0 +1,57 @@ +page_title->push('Fwords'); + $this->data['pagetitle'] = $this->page_title->show(); + $this->breadcrumbs->unshift(1, 'Fwords', 'admin/fwords'); + $this->output->delete_cache(); + } + + public function index(){ + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()){ + redirect('auth/login', 'refresh'); + }else{ + $this->load->model('admin/fword_model'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + //$this->data['fwords'] = $this->fword_model->get_fwords(); + $this->template->admin_render('admin/fwords/index', $this->data); + } + } + + public function toggle_is_active(){ + $word = $this->input->post('word'); + $this->load->model('admin/fword_model'); + echo $this->fword_model->toggle_is_active($word); + } + + public function add_fword(){ + $word = $this->input->post('word'); + $this->load->model('admin/fword_model'); + echo $this->fword_model->add_fword($word); + } + + public function get_fwords_page(){ + $search = (strlen($this->input->get("search")["value"]) >= 2) ? $this->input->get("search",true)["value"] : false; + $start = intval($this->input->get('start')); + $offset = intval($this->input->get('length')); + $this->load->model('admin/fword_model'); + $datas = $this->fword_model->get_fwords_page($search, $start, $offset); + $query = $this->db->last_query(); + $count = $this->fword_model->get_fwords_page_count($search); + + echo json_encode( + Array( + 'draw' => $_GET['draw'], + 'data' => $datas, + 'query' => $query, + 'recordsTotal' => $count, + 'recordsFiltered' => $count, + 'pageNumber' => ceil($start / $offset) + 1, + 'pageSize' => ceil($count / $offset) + 1, + ) + ); + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Groups.php b/2_services/1_metaverse/nodam/application/controllers/admin/Groups.php new file mode 100644 index 0000000000000000000000000000000000000000..6e026a9c610d1ab1a994a5d6049791dd886f0192 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Groups.php @@ -0,0 +1,177 @@ +lang->load('admin/groups'); + + /* Title Page :: Common */ + $this->page_title->push(lang('menu_security_groups')); + $this->data['pagetitle'] = $this->page_title->show(); + + /* Breadcrumbs :: Common */ + $this->breadcrumbs->unshift(1, lang('menu_security_groups'), 'admin/groups'); + } + + + public function index() + { + echo '1'; + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin()) + { + redirect('auth/login', 'refresh'); + } + else + { + /* Breadcrumbs */ + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + + //$this->data['groups'] = $this->ion_auth->groups()->result(); + + /* Load Template */ + $this->template->admin_render('admin/groups/index', $this->data); + } + } + + + public function create() + { + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin()) + { + redirect('auth', 'refresh'); + } + + /* Breadcrumbs */ + $this->breadcrumbs->unshift(2, lang('menu_groups_create'), 'admin/groups/create'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + + /* Validate form input */ + $this->form_validation->set_rules('group_name', 'lang:create_group_validation_name_label', 'required|alpha_dash'); + + if ($this->form_validation->run() == TRUE) + { + $new_group_id = $this->ion_auth->create_group($this->input->post('group_name'), $this->input->post('description')); + if ($new_group_id) + { + $this->session->set_flashdata('message', $this->ion_auth->messages()); + redirect('admin/groups', 'refresh'); + } + } + else + { + $this->data['message'] = (validation_errors() ? validation_errors() : ($this->ion_auth->errors() ? $this->ion_auth->errors() : $this->session->flashdata('message'))); + + $this->data['group_name'] = array( + 'name' => 'group_name', + 'id' => 'group_name', + 'type' => 'text', + 'class' => 'form-control', + 'value' => $this->form_validation->set_value('group_name') + ); + $this->data['description'] = array( + 'name' => 'description', + 'id' => 'description', + 'type' => 'text', + 'class' => 'form-control', + 'value' => $this->form_validation->set_value('description') + ); + + /* Load Template */ + $this->template->admin_render('admin/groups/create', $this->data); + } + } + + + public function delete() + { + if ( ! $this->ion_auth->logged_in()) + { + redirect('auth/login', 'refresh'); + } + elseif ( ! $this->ion_auth->is_admin()) + { + return show_error('You must be an administrator to view this page.'); + } + else + { + $this->load->view('admin/groups/delete'); + } + } + + + public function edit($id) + { + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin() OR ! $id OR empty($id)) + { + redirect('auth', 'refresh'); + } + + /* Breadcrumbs */ + $this->breadcrumbs->unshift(2, lang('menu_groups_edit'), 'admin/groups/edit'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + + /* Variables */ + $group = $this->ion_auth->group($id)->row(); + + /* Validate form input */ + $this->form_validation->set_rules('group_name', $this->lang->line('edit_group_validation_name_label'), 'required|alpha_dash'); + + if (isset($_POST) && ! empty($_POST)) + { + if ($this->form_validation->run() == TRUE) + { + $group_update = $this->ion_auth->update_group($id, $_POST['group_name'], $_POST['group_description']); + + if ($group_update) + { + $this->session->set_flashdata('message', $this->lang->line('edit_group_saved')); + + /* IN TEST */ + $this->db->update('groups', array('bgcolor' => $_POST['group_bgcolor']), 'id = '.$id); + } + else + { + $this->session->set_flashdata('message', $this->ion_auth->errors()); + } + + redirect('admin/groups', 'refresh'); + } + } + + $this->data['message'] = (validation_errors() ? validation_errors() : ($this->ion_auth->errors() ? $this->ion_auth->errors() : $this->session->flashdata('message'))); + $this->data['group'] = $group; + + $readonly = $this->config->item('admin_group', 'ion_auth') === $group->name ? 'readonly' : ''; + + $this->data['group_name'] = array( + 'type' => 'text', + 'name' => 'group_name', + 'id' => 'group_name', + 'value' => $this->form_validation->set_value('group_name', $group->name), + 'class' => 'form-control', + $readonly => $readonly + ); + $this->data['group_description'] = array( + 'type' => 'text', + 'name' => 'group_description', + 'id' => 'group_description', + 'value' => $this->form_validation->set_value('group_description', $group->description), + 'class' => 'form-control' + ); + $this->data['group_bgcolor'] = array( + 'type' => 'text', + 'name' => 'group_bgcolor', + 'id' => 'group_bgcolor', + 'value' => $this->form_validation->set_value('group_bgcolor', $group->bgcolor), + 'data-src' => $group->bgcolor, + 'class' => 'form-control' + ); + + /* Load Template */ + $this->template->admin_render('admin/groups/edit', $this->data); + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/License.php b/2_services/1_metaverse/nodam/application/controllers/admin/License.php new file mode 100644 index 0000000000000000000000000000000000000000..5ef5c85af113b1aa269fd94f9524c653550f1f41 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/License.php @@ -0,0 +1,34 @@ +page_title->push(lang('menu_license')); + $this->data['pagetitle'] = $this->page_title->show(); + + /* Breadcrumbs :: Common */ + $this->breadcrumbs->unshift(1, lang('menu_license'), 'admin/license'); + } + + + public function index() + { + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin()) + { + redirect('auth', 'refresh'); + } + else + { + /* Breadcrumbs */ + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + + /* Load Template */ + $this->template->admin_render('admin/license/index', $this->data); + } + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Medias.php b/2_services/1_metaverse/nodam/application/controllers/admin/Medias.php new file mode 100644 index 0000000000000000000000000000000000000000..0a26e8cc1ece8f5a75430b7c39aff55ce3b256ad --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Medias.php @@ -0,0 +1,37 @@ +page_title->push('Medias'); + $this->data['pagetitle'] = $this->page_title->show(); + $this->breadcrumbs->unshift(1, 'Medias', 'admin/medias'); + $this->output->delete_cache(); + } + + public function index(){ + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()){ + redirect('auth/login', 'refresh'); + }else{ + $this->load->model('admin/media_model'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + $this->data['medias'] = $this->media_model->get_medias(); + $this->template->admin_render('admin/medias/index', $this->data); + } + } + + public function set_media(){ + $uid = $this->input->post('uid'); + $path = $this->input->post('path'); + $this->load->model('admin/path_model'); + echo $this->path_model->set_path($uid, $path); + } + + function gen_uid(){ + $data = random_bytes(16); + $data[6] = chr(ord($data[6]) & 0x0f | 0x40); + $data[8] = chr(ord($data[8]) & 0x3f | 0x80); + return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Pictures.php b/2_services/1_metaverse/nodam/application/controllers/admin/Pictures.php new file mode 100644 index 0000000000000000000000000000000000000000..804056d35ac5ed9e6c6129d5fa9817eb1dd6f21b --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Pictures.php @@ -0,0 +1,29 @@ +page_title->push('Pictures'); + $this->data['pagetitle'] = $this->page_title->show(); + $this->breadcrumbs->unshift(1, 'Pictures', 'admin/pictures'); + $this->output->delete_cache(); + } + + public function index(){ + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()){ + redirect('auth/login', 'refresh'); + }else{ + $this->load->model('admin/picture_model'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + $this->data['pictures'] = $this->picture_model->gets(); + $this->template->admin_render('admin/pictures/index', $this->data); + } + } + + public function toggle_is_active(){ + $uid = $this->input->post('index'); + $this->load->model('admin/picture_model'); + echo $this->picture_model->toggle_is_active($uid); + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Prefs.php b/2_services/1_metaverse/nodam/application/controllers/admin/Prefs.php new file mode 100644 index 0000000000000000000000000000000000000000..eb490f6fdc440e752ff8a5b473197e437661a6d6 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Prefs.php @@ -0,0 +1,171 @@ +load->model('admin/preferences_model'); + $this->lang->load('admin/preferences'); + + /* Breadcrumbs :: Common */ + $this->breadcrumbs->unshift(1, lang('menu_preferences'), 'admin/prefs'); + } + + + public function index() + { + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin()) + { + redirect('auth/login', 'refresh'); + } + else + { + /* Title Page */ + $this->page_title->push(lang('menu_preferences')); + $this->data['pagetitle'] = $this->page_title->show(); + + /* Breadcrumbs */ + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + + /* Load Template */ + $this->template->admin_render('admin/prefs/index', $this->data); + } + } + + + public function interfaces($type = NULL) + { + /* Title Page */ + $this->page_title->push(lang('menu_preferences'), lang('menu_interfaces')); + $this->data['pagetitle'] = $this->page_title->show(); + + /* Breadcrumbs :: Common */ + $this->breadcrumbs->unshift(2, lang('menu_interfaces'), 'admin/prefs/interfaces/admin'); + + if ($type == 'admin') + { + /* Breadcrumbs */ + $this->breadcrumbs->unshift(3, lang('menu_int_admin'), 'admin/prefs/interfaces/admin'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + + /* Validate form input */ + $this->form_validation->set_rules('user_panel', 'lang:prefs_user_panel', 'required|is_numeric'); + $this->form_validation->set_rules('sidebar_form', 'lang:prefs_sidebar_form', 'required|is_numeric'); + $this->form_validation->set_rules('messages_menu', 'lang:prefs_messages_menu', 'required|is_numeric'); + $this->form_validation->set_rules('notifications_menu', 'lang:prefs_notifications_menu', 'required|is_numeric'); + $this->form_validation->set_rules('tasks_menu', 'lang:prefs_tasks_menu', 'required|is_numeric'); + $this->form_validation->set_rules('user_menu', 'lang:prefs_user_menu', 'required|is_numeric'); + $this->form_validation->set_rules('ctrl_sidebar', 'lang:prefs_ctrl_sidebar', 'required|is_numeric'); + $this->form_validation->set_rules('transition_page', 'lang:prefs_transition_page', 'required|is_numeric'); + + /* Data */ + $this->data['message_admin'] = (validation_errors()) ? validation_errors() : NULL; + $this->data['admin_pref_interface'] = $this->preferences_model->get_interface('admin_preferences'); + + if ($this->form_validation->run() == TRUE) + { + $data = array( + 'user_panel' => (bool) $this->input->post('user_panel'), + 'sidebar_form' => (bool) $this->input->post('sidebar_form'), + 'messages_menu' => (bool) $this->input->post('messages_menu'), + 'notifications_menu' => (bool) $this->input->post('notifications_menu'), + 'tasks_menu' => (bool) $this->input->post('tasks_menu'), + 'user_menu' => (bool) $this->input->post('user_menu'), + 'ctrl_sidebar' => (bool) $this->input->post('ctrl_sidebar'), + 'transition_page' => (bool) $this->input->post('transition_page') + ); + + $this->preferences_model->update_interfaces('admin_preferences', $data); + + redirect('admin/prefs/interfaces/admin', 'refresh'); + } + else + { + /* Load Template */ + $this->template->admin_render('admin/prefs/interfaces/admin', $this->data); + } + } + elseif ($type == 'public') + { + /* Breadcrumbs */ + $this->breadcrumbs->unshift(3, lang('menu_int_public'), 'admin/prefs/interfaces/public'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + + /* Validate form input */ + $this->form_validation->set_rules('transition_page', 'lang:prefs_transition_page', 'required|is_numeric'); + + /* Data */ + $this->data['message_public'] = (validation_errors()) ? validation_errors() : NULL; + $this->data['public_pref_interface'] = $this->preferences_model->get_interface('public_preferences'); + + if ($this->form_validation->run() == TRUE) + { + $data = array( + 'transition_page' => (bool) $this->input->post('transition_page') + ); + + $this->preferences_model->update_interfaces('public_preferences', $data); + + redirect('admin/prefs/interfaces/public', 'refresh'); + } + else + { + /* Load Template */ + $this->template->admin_render('admin/prefs/interfaces/public', $this->data); + } + } + else + { + redirect('admin', 'refresh'); + } + } + + + public function reset_interfaces_admin() + { + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin()) + { + redirect('auth', 'refresh'); + } + else + { + $data = array( + 'user_panel' => '0', + 'sidebar_form' => '0', + 'messages_menu' => '0', + 'notifications_menu' => '0', + 'tasks_menu' => '0', + 'user_menu' => '1', + 'ctrl_sidebar' => '0', + 'transition_page' => '0' + ); + + $this->preferences_model->update_interfaces('admin_preferences', $data); + + redirect('admin/prefs/interfaces/admin', 'refresh'); + } + } + + + public function reset_interfaces_public() + { + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin()) + { + redirect('auth', 'refresh'); + } + else + { + $data = array( + 'transition_page' => '0' + ); + + $this->preferences_model->update_interfaces('public_preferences', $data); + + redirect('admin/prefs/interfaces/public', 'refresh'); + } + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Questions.php b/2_services/1_metaverse/nodam/application/controllers/admin/Questions.php new file mode 100644 index 0000000000000000000000000000000000000000..acb96a78fa7dc7fd7811f7a3ee49a3cca76c0763 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Questions.php @@ -0,0 +1,79 @@ +lang->load('admin/users'); + + /* Title Page :: Common */ + $this->page_title->push('Questions'); + $this->data['pagetitle'] = $this->page_title->show(); + + /* Breadcrumbs :: Common */ + $this->breadcrumbs->unshift(1, 'Questions', 'admin/questions'); + $this->output->delete_cache(); + } + + + public function index(){ + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()) + { + redirect('auth/login', 'refresh'); + } + else + { + $this->load->model('admin/question_model'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + $this->data['questions'] = $this->question_model->get_questions(); + //echo print_r($this->data['questions']); + //return; + $this->template->admin_render('admin/questions/index', $this->data); + } + } + + public function toggle_is_active(){ + $uid = $this->input->post('uid'); + $this->load->model('admin/question_model'); + echo $this->question_model->toggle_is_active($uid); + } + + public function set_question(){ + $uid = $this->input->post('uid'); + $level = $this->input->post('level'); + $question = $this->input->post('question'); + $answers = $this->input->post('answers'); + $explain = $this->input->post('explain'); + $this->load->model('admin/question_model'); + echo $this->question_model->set_question($uid, $level, $question, $answers, $explain); + } + + function gen_uid(){ + $data = random_bytes(16); + $data[6] = chr(ord($data[6]) & 0x0f | 0x40); + $data[8] = chr(ord($data[8]) & 0x3f | 0x80); + return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); + } + + public function add_question(){ + $uid = $this->gen_uid(); + $level = $this->input->post('level'); + $question = $this->input->post('question'); + $answers = $this->input->post('answers'); + $explain = $this->input->post('explain'); + $this->load->model('admin/question_model'); + echo $this->question_model->add_question($uid, $level, $question, $answers, $explain); + } + + public function get_missions(){ + $uid = $this->input->post('uid'); + $this->load->model('admin/question_model'); + $res = $this->user_level_model->get_missions($uid); + header('Content-Type: application/json'); + echo json_encode($res); + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Resources.php b/2_services/1_metaverse/nodam/application/controllers/admin/Resources.php new file mode 100644 index 0000000000000000000000000000000000000000..1df62447b79158d81c46027e21a627f4d79d60db --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Resources.php @@ -0,0 +1,34 @@ +page_title->push(lang('menu_resources')); + $this->data['pagetitle'] = $this->page_title->show(); + + /* Breadcrumbs :: Common */ + $this->breadcrumbs->unshift(1, lang('menu_resources'), 'admin/resources'); + } + + + public function index() + { + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin()) + { + redirect('auth', 'refresh'); + } + else + { + /* Breadcrumbs */ + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + + /* Load Template */ + $this->template->admin_render('admin/resources/index', $this->data); + } + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Survey_results.php b/2_services/1_metaverse/nodam/application/controllers/admin/Survey_results.php new file mode 100644 index 0000000000000000000000000000000000000000..20bcdbf8ca549f7606307f6a285ff0fe0666f204 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Survey_results.php @@ -0,0 +1,46 @@ +page_title->push('Survey Results'); + $this->data['pagetitle'] = $this->page_title->show(); + $this->breadcrumbs->unshift(1, 'Survey Results', 'admin/suvey_results'); + $this->output->delete_cache(); + } + + public function index(){ + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()){ + redirect('auth/login', 'refresh'); + }else{ + $this->load->model('admin/survey_result_model'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + $this->data['surveys'] = $this->survey_result_model->gets(); + $this->data['questions'] = $this->survey_result_model->get_surveys(); + $this->template->admin_render('admin/survey_results/index', $this->data); + } + } + + public function get_answers(){ + $index = $this->input->post('index'); + $this->load->model('admin/survey_result_model'); + //echo print_r($this->survey_result_model->get_answers($index)[0]->answers); + //return; + echo json_encode($this->survey_result_model->get_answers($index)[0]->answers); + } + + public function set_media(){ + $uid = $this->input->post('uid'); + $path = $this->input->post('path'); + $this->load->model('admin/path_model'); + echo $this->path_model->set_path($uid, $path); + } + + function gen_uid(){ + $data = random_bytes(16); + $data[6] = chr(ord($data[6]) & 0x0f | 0x40); + $data[8] = chr(ord($data[8]) & 0x3f | 0x80); + return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Surveys.php b/2_services/1_metaverse/nodam/application/controllers/admin/Surveys.php new file mode 100644 index 0000000000000000000000000000000000000000..f4f6273454a4ab8a3b27537394271db5ce26bc2c --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Surveys.php @@ -0,0 +1,52 @@ +page_title->push('Surveys'); + $this->data['pagetitle'] = $this->page_title->show(); + $this->breadcrumbs->unshift(1, 'Surveys', 'admin/surveys'); + $this->output->delete_cache(); + } + + public function index(){ + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()){ + redirect('auth/login', 'refresh'); + }else{ + $this->load->model('admin/survey_model'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + $this->data['questions'] = $this->survey_model->get_questions(); + $this->template->admin_render('admin/surveys/index', $this->data); + } + } + + public function toggle_is_active(){ + $uid = $this->input->post('uid'); + $this->load->model('admin/survey_model'); + echo $this->survey_model->toggle_is_active($uid); + } + + public function set_question(){ + $uid = $this->input->post('uid'); + $question = $this->input->post('question'); + $answers = $this->input->post('answers'); + $this->load->model('admin/survey_model'); + echo $this->survey_model->set_question($uid, $question, $answers); + } + + function gen_uid(){ + $data = random_bytes(16); + $data[6] = chr(ord($data[6]) & 0x0f | 0x40); + $data[8] = chr(ord($data[8]) & 0x3f | 0x80); + return vsprintf('%s%s-%s-%s-%s-%s%s%s', str_split(bin2hex($data), 4)); + } + + public function add_question(){ + $uid = $this->gen_uid(); + $question = $this->input->post('question'); + $answers = $this->input->post('answers'); + $this->load->model('admin/survey_model'); + echo $this->survey_model->add_question($uid, $question, $answers); + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/Users.php b/2_services/1_metaverse/nodam/application/controllers/admin/Users.php new file mode 100644 index 0000000000000000000000000000000000000000..4b3a50f68db2f3c4b5e0f6d18381d22298d7bd27 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/Users.php @@ -0,0 +1,72 @@ +lang->load('admin/users'); + + /* Title Page :: Common */ + $this->page_title->push('Users'); + $this->data['pagetitle'] = $this->page_title->show(); + + /* Breadcrumbs :: Common */ + $this->breadcrumbs->unshift(1, lang('menu_users'), 'admin/users'); + $this->output->delete_cache(); + } + + + public function index(){ + if (!$this->ion_auth->logged_in() || !$this->ion_auth->is_admin()) + { + redirect('auth/login', 'refresh'); + } + else + { + $this->load->model('admin/user_model'); + $this->data['breadcrumb'] = $this->breadcrumbs->show(); + $this->data['users'] = $this->user_model->get_users(); + $this->template->admin_render('admin/users/index', $this->data); + } + } + + public function toggle_is_active(){ + $uid = $this->input->post('uid'); + $this->load->model('admin/user_model'); + echo $this->user_model->toggle_is_active($uid); + } + + public function set_user(){ + $uid = $this->input->post('uid'); + $id = $this->input->post('id'); + $pw = $this->input->post('pw'); + $name = $this->input->post('name'); + $this->load->model('admin/user_model'); + echo $this->user_model->set_user($uid, $id, $pw, $name); + } + + public function get_missions(){ + $uid = $this->input->post('uid'); + $this->load->model('admin/user_level_model'); + $res = $this->user_level_model->get_missions($uid); + header('Content-Type: application/json'); + echo json_encode($res); + } + + public function set_mission(){ + $uid = $this->input->post('uid'); + $point = $this->input->post('point'); + $this->load->model('admin/user_level_model'); + echo $this->user_level_model->set_mission($uid, $point); + } + + public function reset_missions(){ + $uid = $this->input->post('uid'); + $this->load->model('admin/user_level_model'); + echo $this->user_level_model->reset_missions($uid); + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/_Original.php b/2_services/1_metaverse/nodam/application/controllers/admin/_Original.php new file mode 100644 index 0000000000000000000000000000000000000000..3d07d0c9f9a27808ed461be3835c5d124222582a --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/_Original.php @@ -0,0 +1,16 @@ +load->view('public/home'); + } +} diff --git a/2_services/1_metaverse/nodam/application/controllers/admin/index.html b/2_services/1_metaverse/nodam/application/controllers/admin/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/admin/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/controllers/index.html b/2_services/1_metaverse/nodam/application/controllers/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/controllers/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/core/MY_Controller.php b/2_services/1_metaverse/nodam/application/core/MY_Controller.php new file mode 100644 index 0000000000000000000000000000000000000000..1b8356027f74a74e2e68cb50e870cecf8825800b --- /dev/null +++ b/2_services/1_metaverse/nodam/application/core/MY_Controller.php @@ -0,0 +1,128 @@ +load->database(); + + /* Data */ + $this->data['lang'] = element($this->config->item('language'), $this->config->item('language_abbr')); + $this->data['charset'] = $this->config->item('charset'); + $this->data['frameworks_dir'] = $this->config->item('frameworks_dir'); + $this->data['plugins_dir'] = $this->config->item('plugins_dir'); + $this->data['avatar_dir'] = $this->config->item('avatar_dir'); + + /* Any mobile device (phones or tablets) */ + if ($this->mobile_detect->isMobile()) + { + $this->data['mobile'] = TRUE; + + if ($this->mobile_detect->isiOS()){ + $this->data['ios'] = TRUE; + $this->data['android'] = FALSE; + } + elseif ($this->mobile_detect->isAndroidOS()) + { + $this->data['ios'] = FALSE; + $this->data['android'] = TRUE; + } + else + { + $this->data['ios'] = FALSE; + $this->data['android'] = FALSE; + } + + if ($this->mobile_detect->getBrowsers('IE')){ + $this->data['mobile_ie'] = TRUE; + } + else + { + $this->data['mobile_ie'] = FALSE; + } + } + else + { + $this->data['mobile'] = FALSE; + $this->data['ios'] = FALSE; + $this->data['android'] = FALSE; + $this->data['mobile_ie'] = FALSE; + } + } +} + + +class Admin_Controller extends MY_Controller +{ + public function __construct() + { + parent::__construct(); + + if ( ! $this->ion_auth->logged_in() OR ! $this->ion_auth->is_admin()) + { + redirect('auth/login', 'refresh'); + } + else + { + /* Load */ + $this->load->config('admin/dp_config'); + $this->load->library(['admin/breadcrumbs', 'admin/page_title']); + $this->load->model('admin/core_model'); + $this->load->helper('menu'); + $this->lang->load(['admin/main_header', 'admin/main_sidebar', 'admin/footer', 'admin/actions']); + + /* Load library function */ + $this->breadcrumbs->unshift(0, $this->lang->line('menu_dashboard'), 'admin/dashboard'); + + /* Data */ + $this->data['title'] = $this->config->item('title'); + $this->data['title_lg'] = $this->config->item('title_lg'); + $this->data['title_mini'] = $this->config->item('title_mini'); + //$this->data['admin_prefs'] = $this->prefs_model->admin_prefs(); + //$this->data['user_login'] = $this->prefs_model->user_info_login($this->ion_auth->user()->row()->id); + + if ($this->router->fetch_class() == 'dashboard') + { + $this->data['dashboard_alert_file_install'] = $this->core_model->get_file_install(); + $this->data['header_alert_file_install'] = NULL; + } + else + { + $this->data['dashboard_alert_file_install'] = NULL; + $this->data['header_alert_file_install'] = NULL; /* << A MODIFIER !!! */ + } + } + } +} + + +class Public_Controller extends MY_Controller +{ + public function __construct() + { + parent::__construct(); + + if ($this->ion_auth->logged_in() && $this->ion_auth->is_admin()) + { + $this->data['admin_link'] = TRUE; + } + else + { + $this->data['admin_link'] = FALSE; + } + + if ($this->ion_auth->logged_in()) + { + $this->data['logout_link'] = TRUE; + } + else + { + $this->data['logout_link'] = FALSE; + } + } +} diff --git a/2_services/1_metaverse/nodam/application/core/index.html b/2_services/1_metaverse/nodam/application/core/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/core/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/helpers/MY_url_helper.php b/2_services/1_metaverse/nodam/application/helpers/MY_url_helper.php new file mode 100644 index 0000000000000000000000000000000000000000..563d1874aeb90f0ee2e4fac96d51d816de37740a --- /dev/null +++ b/2_services/1_metaverse/nodam/application/helpers/MY_url_helper.php @@ -0,0 +1,45 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/helpers/menu_helper.php b/2_services/1_metaverse/nodam/application/helpers/menu_helper.php new file mode 100644 index 0000000000000000000000000000000000000000..7f1ed6c57cf465b44a98d73009e4d6b295c40e82 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/helpers/menu_helper.php @@ -0,0 +1,25 @@ +router->fetch_class(); + + return ($class == $controller) ? 'active' : NULL; + } +} + + +if ( ! function_exists('active_link_function')) +{ + function active_link_function($controller) + { + $CI =& get_instance(); + $class = $CI->router->fetch_method(); + + return ($class == $controller) ? 'active' : NULL; + } +} diff --git a/2_services/1_metaverse/nodam/application/hooks/index.html b/2_services/1_metaverse/nodam/application/hooks/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/hooks/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/hooks/minify_html.php b/2_services/1_metaverse/nodam/application/hooks/minify_html.php new file mode 100644 index 0000000000000000000000000000000000000000..d15b10064edcf7b5e80f44ad6cdc79ec62597718 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/hooks/minify_html.php @@ -0,0 +1,27 @@ +output->get_output(); + + $re = '%(?>[^\S ]\s*| \s{2,})(?=[^<]*+(?:<(?!/?(?:textarea|pre|script)\b)[^<]*+)*+(?:<(?>textarea|pre|script)\b| \z))%Six'; + + $new_buffer = preg_replace($re, '', $buffer); + + if ($new_buffer === NULL) + { + $new_buffer = $buffer; + } + + $CI->output->set_output($new_buffer); + $CI->output->_display(); + } +} diff --git a/2_services/1_metaverse/nodam/application/index.html b/2_services/1_metaverse/nodam/application/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/language/english/admin/actions_lang.php b/2_services/1_metaverse/nodam/application/language/english/admin/actions_lang.php new file mode 100644 index 0000000000000000000000000000000000000000..cda52305f0b086fac4840ee23cc15bd6edb0edaa --- /dev/null +++ b/2_services/1_metaverse/nodam/application/language/english/admin/actions_lang.php @@ -0,0 +1,26 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/language/english/admin/main_header_lang.php b/2_services/1_metaverse/nodam/application/language/english/admin/main_header_lang.php new file mode 100644 index 0000000000000000000000000000000000000000..1315a6b0d62b71179238551b737eed0b7bd4c1fb --- /dev/null +++ b/2_services/1_metaverse/nodam/application/language/english/admin/main_header_lang.php @@ -0,0 +1,24 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/language/english/ion_auth_lang.php b/2_services/1_metaverse/nodam/application/language/english/ion_auth_lang.php new file mode 100644 index 0000000000000000000000000000000000000000..082089f6c8066d33acaf6680526af22e9ea12953 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/language/english/ion_auth_lang.php @@ -0,0 +1,78 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/language/french/admin/actions_lang.php b/2_services/1_metaverse/nodam/application/language/french/admin/actions_lang.php new file mode 100644 index 0000000000000000000000000000000000000000..8439ace80a5fb563e04ba2280af2bb805f575f9e --- /dev/null +++ b/2_services/1_metaverse/nodam/application/language/french/admin/actions_lang.php @@ -0,0 +1,26 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/language/french/admin/main_header_lang.php b/2_services/1_metaverse/nodam/application/language/french/admin/main_header_lang.php new file mode 100644 index 0000000000000000000000000000000000000000..7335a640bb8d131c20ce8fc942309ee49fc4e21c --- /dev/null +++ b/2_services/1_metaverse/nodam/application/language/french/admin/main_header_lang.php @@ -0,0 +1,24 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/language/french/ion_auth_lang.php b/2_services/1_metaverse/nodam/application/language/french/ion_auth_lang.php new file mode 100644 index 0000000000000000000000000000000000000000..b78d61a95e74857ee53898661168e65ad6183635 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/language/french/ion_auth_lang.php @@ -0,0 +1,81 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/language/index.html b/2_services/1_metaverse/nodam/application/language/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/language/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/language/portuguese/admin/actions_lang.php b/2_services/1_metaverse/nodam/application/language/portuguese/admin/actions_lang.php new file mode 100644 index 0000000000000000000000000000000000000000..b042c4326d094629d15ca3293ad4f9b743028eed --- /dev/null +++ b/2_services/1_metaverse/nodam/application/language/portuguese/admin/actions_lang.php @@ -0,0 +1,26 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/language/portuguese/admin/main_header_lang.php b/2_services/1_metaverse/nodam/application/language/portuguese/admin/main_header_lang.php new file mode 100644 index 0000000000000000000000000000000000000000..e4c0db70cdbd9d4c1c246bf2963ccfc5dae0fb0f --- /dev/null +++ b/2_services/1_metaverse/nodam/application/language/portuguese/admin/main_header_lang.php @@ -0,0 +1,24 @@ +%s'; +$lang['deactivate_confirm_y_label'] = 'Sim:'; +$lang['deactivate_confirm_n_label'] = 'Não:'; +$lang['deactivate_submit_btn'] = 'Enviar'; +$lang['deactivate_validation_confirm_label'] = 'confirmação'; +$lang['deactivate_validation_user_id_label'] = 'user ID'; + +// Create User +$lang['create_user_heading'] = 'Criar Usuário'; +$lang['create_user_subheading'] = 'Por favor informe os dados do usuário.'; +$lang['create_user_fname_label'] = 'Nome:'; +$lang['create_user_lname_label'] = 'Sobrenome:'; +$lang['create_user_company_label'] = 'Empresa:'; +$lang['create_user_email_label'] = 'Email:'; +$lang['create_user_phone_label'] = 'Telefone:'; +$lang['create_user_password_label'] = 'Senha:'; +$lang['create_user_password_confirm_label'] = 'Confirmar senha:'; +$lang['create_user_submit_btn'] = 'Criar Usuário'; +$lang['create_user_validation_fname_label'] = 'Nome'; +$lang['create_user_validation_lname_label'] = 'Sobrenome'; +$lang['create_user_validation_email_label'] = 'Email'; +$lang['create_user_validation_phone_label'] = 'Telefone'; +$lang['create_user_validation_company_label'] = 'Empresa'; +$lang['create_user_validation_password_label'] = 'Senha'; +$lang['create_user_validation_password_confirm_label'] = 'Confirmação de Senha'; + +// Edit User +$lang['edit_user_heading'] = 'Editar Usuário'; +$lang['edit_user_subheading'] = 'Por favor informe os dados sobre o usuário abaixo.'; +$lang['edit_user_fname_label'] = 'Nome:'; +$lang['edit_user_lname_label'] = 'Sobrenome:'; +$lang['edit_user_company_label'] = 'Empresa:'; +$lang['edit_user_email_label'] = 'Email:'; +$lang['edit_user_phone_label'] = 'Telefone:'; +$lang['edit_user_password_label'] = 'Senha: (se quiser mudar a senha)'; +$lang['edit_user_password_confirm_label'] = 'Confirme a senha: (se quiser mudar a senha)'; +$lang['edit_user_groups_heading'] = 'Membro dos grupos'; +$lang['edit_user_submit_btn'] = 'Salvar Usuário'; +$lang['edit_user_validation_fname_label'] = 'Nome'; +$lang['edit_user_validation_lname_label'] = 'Sobrenome'; +$lang['edit_user_validation_email_label'] = 'Email'; +$lang['edit_user_validation_phone_label'] = 'Telefone'; +$lang['edit_user_validation_company_label'] = 'Empresa'; +$lang['edit_user_validation_groups_label'] = 'Grupos'; +$lang['edit_user_validation_password_label'] = 'Senha'; +$lang['edit_user_validation_password_confirm_label'] = 'Confirme a senha'; + +// Create Group +$lang['create_group_title'] = 'Criar Grupo'; +$lang['create_group_heading'] = 'Criar Grupo'; +$lang['create_group_subheading'] = 'Por favor informe os dados sobre o grupo abaixo.'; +$lang['create_group_name_label'] = 'Nome:'; +$lang['create_group_desc_label'] = 'Descrição:'; +$lang['create_group_submit_btn'] = 'Criar Grupo'; +$lang['create_group_validation_name_label'] = 'Nome'; +$lang['create_group_validation_desc_label'] = 'Descrição'; + +// Edit Group +$lang['edit_group_title'] = 'Editar Grupo'; +$lang['edit_group_saved'] = 'Grupo Salvo'; +$lang['edit_group_heading'] = 'Editar Group'; +$lang['edit_group_subheading'] = 'Por favor informe os dados sobre o grupo abaixo.'; +$lang['edit_group_name_label'] = 'Nome:'; +$lang['edit_group_desc_label'] = 'Descrição:'; +$lang['edit_group_submit_btn'] = 'Salvar Grupo'; +$lang['edit_group_validation_name_label'] = 'Nome'; +$lang['edit_group_validation_desc_label'] = 'Descrição'; + +// Change Password +$lang['change_password_heading'] = 'Mudar Senha'; +$lang['change_password_old_password_label'] = 'Senha Antiga:'; +$lang['change_password_new_password_label'] = 'Nova senha: (mínimo de %s caracteres)'; +$lang['change_password_new_password_confirm_label'] = 'Confirme sua Nova Senha:'; +$lang['change_password_submit_btn'] = 'Mudar'; +$lang['change_password_validation_old_password_label'] = 'Senha Antiga'; +$lang['change_password_validation_new_password_label'] = 'Nova Senha'; +$lang['change_password_validation_new_password_confirm_label'] = 'Confirme sua Nova Senha'; + +// Forgot Password +$lang['forgot_password_heading'] = 'Esqueceu a Senha'; +$lang['forgot_password_subheading'] = 'Por favor, informe seu %s para que possamos enviar para você uma mensagem para recuparar sua senha.'; +$lang['forgot_password_email_label'] = '%s:'; +$lang['forgot_password_submit_btn'] = 'Enviar'; +$lang['forgot_password_validation_email_label'] = 'Email'; +$lang['forgot_password_username_identity_label'] = 'Login'; +$lang['forgot_password_email_identity_label'] = 'Email'; +$lang['forgot_password_email_not_found'] = 'Este email não foi encontrado.'; + +// Reset Password +$lang['reset_password_heading'] = 'Mudar Senha'; +$lang['reset_password_new_password_label'] = 'Nova senha: (mínimo de %s caracteres)'; +$lang['reset_password_new_password_confirm_label'] = 'Confirme sua Nova Senha:'; +$lang['reset_password_submit_btn'] = 'Mudar'; +$lang['reset_password_validation_new_password_label'] = 'Senha Antiga'; +$lang['reset_password_validation_new_password_confirm_label'] = 'Confirme sua Nova Senha'; diff --git a/2_services/1_metaverse/nodam/application/language/portuguese/index.html b/2_services/1_metaverse/nodam/application/language/portuguese/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/language/portuguese/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/language/portuguese/ion_auth_lang.php b/2_services/1_metaverse/nodam/application/language/portuguese/ion_auth_lang.php new file mode 100644 index 0000000000000000000000000000000000000000..f5769b03f42b273970752ee16eec1da1db5e3f0d --- /dev/null +++ b/2_services/1_metaverse/nodam/application/language/portuguese/ion_auth_lang.php @@ -0,0 +1,78 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/libraries/Template.php b/2_services/1_metaverse/nodam/application/libraries/Template.php new file mode 100644 index 0000000000000000000000000000000000000000..b98b7638e96502d5e7849f1b8937e1bcf5263538 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/libraries/Template.php @@ -0,0 +1,50 @@ +CI =& get_instance(); + } + + + public function admin_render($content, $data = NULL) + { + if ( ! $content) + { + return NULL; + } + else + { + $this->template['header'] = $this->CI->load->view('admin/_templates/header', $data, TRUE); + $this->template['main_header'] = $this->CI->load->view('admin/_templates/main_header', $data, TRUE); + $this->template['main_sidebar'] = $this->CI->load->view('admin/_templates/main_sidebar', $data, TRUE); + $this->template['content'] = $this->CI->load->view($content, $data, TRUE); + //$this->template['control_sidebar'] = $this->CI->load->view('admin/_templates/control_sidebar', $data, TRUE); + $this->template['footer'] = $this->CI->load->view('admin/_templates/footer', $data, TRUE); + + return $this->CI->load->view('admin/_templates/template', $this->template); + } + } + + + public function auth_render($content, $data = NULL) + { + if ( ! $content) + { + return NULL; + } + else + { + $this->template['header'] = $this->CI->load->view('auth/_templates/header', $data, TRUE); + $this->template['content'] = $this->CI->load->view($content, $data, TRUE); + $this->template['footer'] = $this->CI->load->view('auth/_templates/footer', $data, TRUE); + + return $this->CI->load->view('auth/_templates/template', $this->template); + } + } + +} diff --git a/2_services/1_metaverse/nodam/application/libraries/admin/Breadcrumbs.php b/2_services/1_metaverse/nodam/application/libraries/admin/Breadcrumbs.php new file mode 100644 index 0000000000000000000000000000000000000000..39dfc114d717969ab99a3d9fdae5e1faaffa2f68 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/libraries/admin/Breadcrumbs.php @@ -0,0 +1,85 @@ +> https://github.com/nobuti/Codeigniter-breadcrumbs +class Breadcrumbs { + + protected $CI; + + private $breadcrumbs = array(); + + public function __construct() + { + $this->CI =& get_instance(); + + $this->breadcrumb_open = $this->CI->config->item('breadcrumb_open'); + $this->breadcrumb_close = $this->CI->config->item('breadcrumb_close'); + $this->breadcrumb_el_open = $this->CI->config->item('breadcrumb_el_open'); + $this->breadcrumb_el_close = $this->CI->config->item('breadcrumb_el_close'); + $this->breadcrumb_el_first = $this->CI->config->item('breadcrumb_el_first'); + $this->breadcrumb_el_last_open = $this->CI->config->item('breadcrumb_el_last'); + } + + + function array_sorter($key) + { + return function ($a, $b) use ($key) + { + return strnatcmp($a[$key], $b[$key]); + }; + } + + + function push($id, $page, $url) + { + if (!$page OR !$url) return; + + $url = site_url($url); + + $this->breadcrumbs[$url] = array('id' => $id, 'page' => $page, 'href' => $url); + } + + + function unshift($id, $page, $url) + { + if (!$page OR !$url) return; + + $url = site_url($url); + + array_unshift($this->breadcrumbs, array('id' => $id, 'page' => $page, 'href' => $url)); + } + + + function show() + { + if ($this->breadcrumbs) + { + $output = $this->breadcrumb_open ."\n"; + + usort($this->breadcrumbs, $this->array_sorter('id')); + + foreach ($this->breadcrumbs as $key => $value) + { + $keys = array_keys($this->breadcrumbs); + + if (reset($keys) == $key) + { + $output.= "\t\t\t". $this->breadcrumb_el_open .''. $this->breadcrumb_el_first .' '. $value['page'] .' '. $this->breadcrumb_el_close ."\n"; + } + elseif (end($keys) == $key) + { + $output.= "\t\t\t". $this->breadcrumb_el_last_open . $value['page'] . $this->breadcrumb_el_close ."\n"; + } + else + { + $output.= "\t\t\t". $this->breadcrumb_el_open .''. $value['page'] .' '. $this->breadcrumb_el_close ."\n"; + } + } + + return $output. "\t\t\t". $this->breadcrumb_close ."\n"; + } + + return NULL; + } + +} diff --git a/2_services/1_metaverse/nodam/application/libraries/admin/Page_title.php b/2_services/1_metaverse/nodam/application/libraries/admin/Page_title.php new file mode 100644 index 0000000000000000000000000000000000000000..2a237203d5f248d2b1e497e58221ff4fcf6f79e6 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/libraries/admin/Page_title.php @@ -0,0 +1,56 @@ +CI =& get_instance(); + + $this->pagetitle_open = $this->CI->config->item('pagetitle_open'); + $this->pagetitle_close = $this->CI->config->item('pagetitle_close'); + $this->pagetitle_el_open = $this->CI->config->item('pagetitle_el_open'); + $this->pagetitle_el_close = $this->CI->config->item('pagetitle_el_close'); + } + + + function push($title, $subtitle = '') + { + if (!$title) return; + + array_unshift($this->page_title, array('title' => $title, 'subtitle' => $subtitle)); + } + + + function show() + { + if ($this->page_title) + { + $output = $this->pagetitle_open; + + foreach ($this->page_title as $key => $value) + { + if (!empty($value['subtitle'])) + { + $subtitle = ' ' . $this->pagetitle_el_open . $value['subtitle'] . $this->pagetitle_el_close; + } + else + { + $subtitle = NULL; + } + + $output.= $value['title'] . $subtitle; + } + + return $output. $this->pagetitle_close ."\n"; + } + + return NULL; + } + +} diff --git a/2_services/1_metaverse/nodam/application/libraries/admin/index.html b/2_services/1_metaverse/nodam/application/libraries/admin/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/libraries/admin/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/libraries/common/Mobile_detect.php b/2_services/1_metaverse/nodam/application/libraries/common/Mobile_detect.php new file mode 100644 index 0000000000000000000000000000000000000000..6ccf39b7f4ea7d20a382945121d6210be2316f39 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/libraries/common/Mobile_detect.php @@ -0,0 +1,1472 @@ + + * Nick Ilyin + * + * Original author: Victor Stanciu + * + * @license Code and contributions have 'MIT License' + * More details: https://github.com/serbanghita/Mobile-Detect/blob/master/LICENSE.txt + * + * @link Homepage: http://mobiledetect.net + * GitHub Repo: https://github.com/serbanghita/Mobile-Detect + * Google Code: http://code.google.com/p/php-mobile-detect/ + * README: https://github.com/serbanghita/Mobile-Detect/blob/master/README.md + * HOWTO: https://github.com/serbanghita/Mobile-Detect/wiki/Code-examples + * + * @version 2.8.30 + */ + +class Mobile_Detect +{ + /** + * Mobile detection type. + * + * @deprecated since version 2.6.9 + */ + const DETECTION_TYPE_MOBILE = 'mobile'; + + /** + * Extended detection type. + * + * @deprecated since version 2.6.9 + */ + const DETECTION_TYPE_EXTENDED = 'extended'; + + /** + * A frequently used regular expression to extract version #s. + * + * @deprecated since version 2.6.9 + */ + const VER = '([\w._\+]+)'; + + /** + * Top-level device. + */ + const MOBILE_GRADE_A = 'A'; + + /** + * Mid-level device. + */ + const MOBILE_GRADE_B = 'B'; + + /** + * Low-level device. + */ + const MOBILE_GRADE_C = 'C'; + + /** + * Stores the version number of the current release. + */ + const VERSION = '2.8.30'; + + /** + * A type for the version() method indicating a string return value. + */ + const VERSION_TYPE_STRING = 'text'; + + /** + * A type for the version() method indicating a float return value. + */ + const VERSION_TYPE_FLOAT = 'float'; + + /** + * A cache for resolved matches + * @var array + */ + protected $cache = array(); + + /** + * The User-Agent HTTP header is stored in here. + * @var string + */ + protected $userAgent = null; + + /** + * HTTP headers in the PHP-flavor. So HTTP_USER_AGENT and SERVER_SOFTWARE. + * @var array + */ + protected $httpHeaders = array(); + + /** + * CloudFront headers. E.g. CloudFront-Is-Desktop-Viewer, CloudFront-Is-Mobile-Viewer & CloudFront-Is-Tablet-Viewer. + * @var array + */ + protected $cloudfrontHeaders = array(); + + /** + * The matching Regex. + * This is good for debug. + * @var string + */ + protected $matchingRegex = null; + + /** + * The matches extracted from the regex expression. + * This is good for debug. + * @var string + */ + protected $matchesArray = null; + + /** + * The detection type, using self::DETECTION_TYPE_MOBILE or self::DETECTION_TYPE_EXTENDED. + * + * @deprecated since version 2.6.9 + * + * @var string + */ + protected $detectionType = self::DETECTION_TYPE_MOBILE; + + /** + * HTTP headers that trigger the 'isMobile' detection + * to be true. + * + * @var array + */ + protected static $mobileHeaders = array( + + 'HTTP_ACCEPT' => array('matches' => array( + // Opera Mini; @reference: http://dev.opera.com/articles/view/opera-binary-markup-language/ + 'application/x-obml2d', + // BlackBerry devices. + 'application/vnd.rim.html', + 'text/vnd.wap.wml', + 'application/vnd.wap.xhtml+xml' + )), + 'HTTP_X_WAP_PROFILE' => null, + 'HTTP_X_WAP_CLIENTID' => null, + 'HTTP_WAP_CONNECTION' => null, + 'HTTP_PROFILE' => null, + // Reported by Opera on Nokia devices (eg. C3). + 'HTTP_X_OPERAMINI_PHONE_UA' => null, + 'HTTP_X_NOKIA_GATEWAY_ID' => null, + 'HTTP_X_ORANGE_ID' => null, + 'HTTP_X_VODAFONE_3GPDPCONTEXT' => null, + 'HTTP_X_HUAWEI_USERID' => null, + // Reported by Windows Smartphones. + 'HTTP_UA_OS' => null, + // Reported by Verizon, Vodafone proxy system. + 'HTTP_X_MOBILE_GATEWAY' => null, + // Seen this on HTC Sensation. SensationXE_Beats_Z715e. + 'HTTP_X_ATT_DEVICEID' => null, + // Seen this on a HTC. + 'HTTP_UA_CPU' => array('matches' => array('ARM')), + ); + + /** + * List of mobile devices (phones). + * + * @var array + */ + protected static $phoneDevices = array( + 'iPhone' => '\biPhone\b|\biPod\b', // |\biTunes + 'BlackBerry' => 'BlackBerry|\bBB10\b|rim[0-9]+', + 'HTC' => 'HTC|HTC.*(Sensation|Evo|Vision|Explorer|6800|8100|8900|A7272|S510e|C110e|Legend|Desire|T8282)|APX515CKT|Qtek9090|APA9292KT|HD_mini|Sensation.*Z710e|PG86100|Z715e|Desire.*(A8181|HD)|ADR6200|ADR6400L|ADR6425|001HT|Inspire 4G|Android.*\bEVO\b|T-Mobile G1|Z520m|Android [0-9.]+; Pixel', + 'Nexus' => 'Nexus One|Nexus S|Galaxy.*Nexus|Android.*Nexus.*Mobile|Nexus 4|Nexus 5|Nexus 6', + // @todo: Is 'Dell Streak' a tablet or a phone? ;) + 'Dell' => 'Dell[;]? (Streak|Aero|Venue|Venue Pro|Flash|Smoke|Mini 3iX)|XCD28|XCD35|\b001DL\b|\b101DL\b|\bGS01\b', + 'Motorola' => 'Motorola|DROIDX|DROID BIONIC|\bDroid\b.*Build|Android.*Xoom|HRI39|MOT-|A1260|A1680|A555|A853|A855|A953|A955|A956|Motorola.*ELECTRIFY|Motorola.*i1|i867|i940|MB200|MB300|MB501|MB502|MB508|MB511|MB520|MB525|MB526|MB611|MB612|MB632|MB810|MB855|MB860|MB861|MB865|MB870|ME501|ME502|ME511|ME525|ME600|ME632|ME722|ME811|ME860|ME863|ME865|MT620|MT710|MT716|MT720|MT810|MT870|MT917|Motorola.*TITANIUM|WX435|WX445|XT300|XT301|XT311|XT316|XT317|XT319|XT320|XT390|XT502|XT530|XT531|XT532|XT535|XT603|XT610|XT611|XT615|XT681|XT701|XT702|XT711|XT720|XT800|XT806|XT860|XT862|XT875|XT882|XT883|XT894|XT901|XT907|XT909|XT910|XT912|XT928|XT926|XT915|XT919|XT925|XT1021|\bMoto E\b|XT1068|XT1092', + 'Samsung' => '\bSamsung\b|SM-G950F|SM-G955F|SM-G9250|GT-19300|SGH-I337|BGT-S5230|GT-B2100|GT-B2700|GT-B2710|GT-B3210|GT-B3310|GT-B3410|GT-B3730|GT-B3740|GT-B5510|GT-B5512|GT-B5722|GT-B6520|GT-B7300|GT-B7320|GT-B7330|GT-B7350|GT-B7510|GT-B7722|GT-B7800|GT-C3010|GT-C3011|GT-C3060|GT-C3200|GT-C3212|GT-C3212I|GT-C3262|GT-C3222|GT-C3300|GT-C3300K|GT-C3303|GT-C3303K|GT-C3310|GT-C3322|GT-C3330|GT-C3350|GT-C3500|GT-C3510|GT-C3530|GT-C3630|GT-C3780|GT-C5010|GT-C5212|GT-C6620|GT-C6625|GT-C6712|GT-E1050|GT-E1070|GT-E1075|GT-E1080|GT-E1081|GT-E1085|GT-E1087|GT-E1100|GT-E1107|GT-E1110|GT-E1120|GT-E1125|GT-E1130|GT-E1160|GT-E1170|GT-E1175|GT-E1180|GT-E1182|GT-E1200|GT-E1210|GT-E1225|GT-E1230|GT-E1390|GT-E2100|GT-E2120|GT-E2121|GT-E2152|GT-E2220|GT-E2222|GT-E2230|GT-E2232|GT-E2250|GT-E2370|GT-E2550|GT-E2652|GT-E3210|GT-E3213|GT-I5500|GT-I5503|GT-I5700|GT-I5800|GT-I5801|GT-I6410|GT-I6420|GT-I7110|GT-I7410|GT-I7500|GT-I8000|GT-I8150|GT-I8160|GT-I8190|GT-I8320|GT-I8330|GT-I8350|GT-I8530|GT-I8700|GT-I8703|GT-I8910|GT-I9000|GT-I9001|GT-I9003|GT-I9010|GT-I9020|GT-I9023|GT-I9070|GT-I9082|GT-I9100|GT-I9103|GT-I9220|GT-I9250|GT-I9300|GT-I9305|GT-I9500|GT-I9505|GT-M3510|GT-M5650|GT-M7500|GT-M7600|GT-M7603|GT-M8800|GT-M8910|GT-N7000|GT-S3110|GT-S3310|GT-S3350|GT-S3353|GT-S3370|GT-S3650|GT-S3653|GT-S3770|GT-S3850|GT-S5210|GT-S5220|GT-S5229|GT-S5230|GT-S5233|GT-S5250|GT-S5253|GT-S5260|GT-S5263|GT-S5270|GT-S5300|GT-S5330|GT-S5350|GT-S5360|GT-S5363|GT-S5369|GT-S5380|GT-S5380D|GT-S5560|GT-S5570|GT-S5600|GT-S5603|GT-S5610|GT-S5620|GT-S5660|GT-S5670|GT-S5690|GT-S5750|GT-S5780|GT-S5830|GT-S5839|GT-S6102|GT-S6500|GT-S7070|GT-S7200|GT-S7220|GT-S7230|GT-S7233|GT-S7250|GT-S7500|GT-S7530|GT-S7550|GT-S7562|GT-S7710|GT-S8000|GT-S8003|GT-S8500|GT-S8530|GT-S8600|SCH-A310|SCH-A530|SCH-A570|SCH-A610|SCH-A630|SCH-A650|SCH-A790|SCH-A795|SCH-A850|SCH-A870|SCH-A890|SCH-A930|SCH-A950|SCH-A970|SCH-A990|SCH-I100|SCH-I110|SCH-I400|SCH-I405|SCH-I500|SCH-I510|SCH-I515|SCH-I600|SCH-I730|SCH-I760|SCH-I770|SCH-I830|SCH-I910|SCH-I920|SCH-I959|SCH-LC11|SCH-N150|SCH-N300|SCH-R100|SCH-R300|SCH-R351|SCH-R400|SCH-R410|SCH-T300|SCH-U310|SCH-U320|SCH-U350|SCH-U360|SCH-U365|SCH-U370|SCH-U380|SCH-U410|SCH-U430|SCH-U450|SCH-U460|SCH-U470|SCH-U490|SCH-U540|SCH-U550|SCH-U620|SCH-U640|SCH-U650|SCH-U660|SCH-U700|SCH-U740|SCH-U750|SCH-U810|SCH-U820|SCH-U900|SCH-U940|SCH-U960|SCS-26UC|SGH-A107|SGH-A117|SGH-A127|SGH-A137|SGH-A157|SGH-A167|SGH-A177|SGH-A187|SGH-A197|SGH-A227|SGH-A237|SGH-A257|SGH-A437|SGH-A517|SGH-A597|SGH-A637|SGH-A657|SGH-A667|SGH-A687|SGH-A697|SGH-A707|SGH-A717|SGH-A727|SGH-A737|SGH-A747|SGH-A767|SGH-A777|SGH-A797|SGH-A817|SGH-A827|SGH-A837|SGH-A847|SGH-A867|SGH-A877|SGH-A887|SGH-A897|SGH-A927|SGH-B100|SGH-B130|SGH-B200|SGH-B220|SGH-C100|SGH-C110|SGH-C120|SGH-C130|SGH-C140|SGH-C160|SGH-C170|SGH-C180|SGH-C200|SGH-C207|SGH-C210|SGH-C225|SGH-C230|SGH-C417|SGH-C450|SGH-D307|SGH-D347|SGH-D357|SGH-D407|SGH-D415|SGH-D780|SGH-D807|SGH-D980|SGH-E105|SGH-E200|SGH-E315|SGH-E316|SGH-E317|SGH-E335|SGH-E590|SGH-E635|SGH-E715|SGH-E890|SGH-F300|SGH-F480|SGH-I200|SGH-I300|SGH-I320|SGH-I550|SGH-I577|SGH-I600|SGH-I607|SGH-I617|SGH-I627|SGH-I637|SGH-I677|SGH-I700|SGH-I717|SGH-I727|SGH-i747M|SGH-I777|SGH-I780|SGH-I827|SGH-I847|SGH-I857|SGH-I896|SGH-I897|SGH-I900|SGH-I907|SGH-I917|SGH-I927|SGH-I937|SGH-I997|SGH-J150|SGH-J200|SGH-L170|SGH-L700|SGH-M110|SGH-M150|SGH-M200|SGH-N105|SGH-N500|SGH-N600|SGH-N620|SGH-N625|SGH-N700|SGH-N710|SGH-P107|SGH-P207|SGH-P300|SGH-P310|SGH-P520|SGH-P735|SGH-P777|SGH-Q105|SGH-R210|SGH-R220|SGH-R225|SGH-S105|SGH-S307|SGH-T109|SGH-T119|SGH-T139|SGH-T209|SGH-T219|SGH-T229|SGH-T239|SGH-T249|SGH-T259|SGH-T309|SGH-T319|SGH-T329|SGH-T339|SGH-T349|SGH-T359|SGH-T369|SGH-T379|SGH-T409|SGH-T429|SGH-T439|SGH-T459|SGH-T469|SGH-T479|SGH-T499|SGH-T509|SGH-T519|SGH-T539|SGH-T559|SGH-T589|SGH-T609|SGH-T619|SGH-T629|SGH-T639|SGH-T659|SGH-T669|SGH-T679|SGH-T709|SGH-T719|SGH-T729|SGH-T739|SGH-T746|SGH-T749|SGH-T759|SGH-T769|SGH-T809|SGH-T819|SGH-T839|SGH-T919|SGH-T929|SGH-T939|SGH-T959|SGH-T989|SGH-U100|SGH-U200|SGH-U800|SGH-V205|SGH-V206|SGH-X100|SGH-X105|SGH-X120|SGH-X140|SGH-X426|SGH-X427|SGH-X475|SGH-X495|SGH-X497|SGH-X507|SGH-X600|SGH-X610|SGH-X620|SGH-X630|SGH-X700|SGH-X820|SGH-X890|SGH-Z130|SGH-Z150|SGH-Z170|SGH-ZX10|SGH-ZX20|SHW-M110|SPH-A120|SPH-A400|SPH-A420|SPH-A460|SPH-A500|SPH-A560|SPH-A600|SPH-A620|SPH-A660|SPH-A700|SPH-A740|SPH-A760|SPH-A790|SPH-A800|SPH-A820|SPH-A840|SPH-A880|SPH-A900|SPH-A940|SPH-A960|SPH-D600|SPH-D700|SPH-D710|SPH-D720|SPH-I300|SPH-I325|SPH-I330|SPH-I350|SPH-I500|SPH-I600|SPH-I700|SPH-L700|SPH-M100|SPH-M220|SPH-M240|SPH-M300|SPH-M305|SPH-M320|SPH-M330|SPH-M350|SPH-M360|SPH-M370|SPH-M380|SPH-M510|SPH-M540|SPH-M550|SPH-M560|SPH-M570|SPH-M580|SPH-M610|SPH-M620|SPH-M630|SPH-M800|SPH-M810|SPH-M850|SPH-M900|SPH-M910|SPH-M920|SPH-M930|SPH-N100|SPH-N200|SPH-N240|SPH-N300|SPH-N400|SPH-Z400|SWC-E100|SCH-i909|GT-N7100|GT-N7105|SCH-I535|SM-N900A|SGH-I317|SGH-T999L|GT-S5360B|GT-I8262|GT-S6802|GT-S6312|GT-S6310|GT-S5312|GT-S5310|GT-I9105|GT-I8510|GT-S6790N|SM-G7105|SM-N9005|GT-S5301|GT-I9295|GT-I9195|SM-C101|GT-S7392|GT-S7560|GT-B7610|GT-I5510|GT-S7582|GT-S7530E|GT-I8750|SM-G9006V|SM-G9008V|SM-G9009D|SM-G900A|SM-G900D|SM-G900F|SM-G900H|SM-G900I|SM-G900J|SM-G900K|SM-G900L|SM-G900M|SM-G900P|SM-G900R4|SM-G900S|SM-G900T|SM-G900V|SM-G900W8|SHV-E160K|SCH-P709|SCH-P729|SM-T2558|GT-I9205|SM-G9350|SM-J120F|SM-G920F|SM-G920V|SM-G930F|SM-N910C|SM-A310F|GT-I9190|SM-J500FN|SM-G903F', + 'LG' => '\bLG\b;|LG[- ]?(C800|C900|E400|E610|E900|E-900|F160|F180K|F180L|F180S|730|855|L160|LS740|LS840|LS970|LU6200|MS690|MS695|MS770|MS840|MS870|MS910|P500|P700|P705|VM696|AS680|AS695|AX840|C729|E970|GS505|272|C395|E739BK|E960|L55C|L75C|LS696|LS860|P769BK|P350|P500|P509|P870|UN272|US730|VS840|VS950|LN272|LN510|LS670|LS855|LW690|MN270|MN510|P509|P769|P930|UN200|UN270|UN510|UN610|US670|US740|US760|UX265|UX840|VN271|VN530|VS660|VS700|VS740|VS750|VS910|VS920|VS930|VX9200|VX11000|AX840A|LW770|P506|P925|P999|E612|D955|D802|MS323)', + 'Sony' => 'SonyST|SonyLT|SonyEricsson|SonyEricssonLT15iv|LT18i|E10i|LT28h|LT26w|SonyEricssonMT27i|C5303|C6902|C6903|C6906|C6943|D2533', + 'Asus' => 'Asus.*Galaxy|PadFone.*Mobile', + 'NokiaLumia' => 'Lumia [0-9]{3,4}', + // http://www.micromaxinfo.com/mobiles/smartphones + // Added because the codes might conflict with Acer Tablets. + 'Micromax' => 'Micromax.*\b(A210|A92|A88|A72|A111|A110Q|A115|A116|A110|A90S|A26|A51|A35|A54|A25|A27|A89|A68|A65|A57|A90)\b', + // @todo Complete the regex. + 'Palm' => 'PalmSource|Palm', // avantgo|blazer|elaine|hiptop|plucker|xiino ; + 'Vertu' => 'Vertu|Vertu.*Ltd|Vertu.*Ascent|Vertu.*Ayxta|Vertu.*Constellation(F|Quest)?|Vertu.*Monika|Vertu.*Signature', // Just for fun ;) + // http://www.pantech.co.kr/en/prod/prodList.do?gbrand=VEGA (PANTECH) + // Most of the VEGA devices are legacy. PANTECH seem to be newer devices based on Android. + 'Pantech' => 'PANTECH|IM-A850S|IM-A840S|IM-A830L|IM-A830K|IM-A830S|IM-A820L|IM-A810K|IM-A810S|IM-A800S|IM-T100K|IM-A725L|IM-A780L|IM-A775C|IM-A770K|IM-A760S|IM-A750K|IM-A740S|IM-A730S|IM-A720L|IM-A710K|IM-A690L|IM-A690S|IM-A650S|IM-A630K|IM-A600S|VEGA PTL21|PT003|P8010|ADR910L|P6030|P6020|P9070|P4100|P9060|P5000|CDM8992|TXT8045|ADR8995|IS11PT|P2030|P6010|P8000|PT002|IS06|CDM8999|P9050|PT001|TXT8040|P2020|P9020|P2000|P7040|P7000|C790', + // http://www.fly-phone.com/devices/smartphones/ ; Included only smartphones. + 'Fly' => 'IQ230|IQ444|IQ450|IQ440|IQ442|IQ441|IQ245|IQ256|IQ236|IQ255|IQ235|IQ245|IQ275|IQ240|IQ285|IQ280|IQ270|IQ260|IQ250', + // http://fr.wikomobile.com + 'Wiko' => 'KITE 4G|HIGHWAY|GETAWAY|STAIRWAY|DARKSIDE|DARKFULL|DARKNIGHT|DARKMOON|SLIDE|WAX 4G|RAINBOW|BLOOM|SUNSET|GOA(?!nna)|LENNY|BARRY|IGGY|OZZY|CINK FIVE|CINK PEAX|CINK PEAX 2|CINK SLIM|CINK SLIM 2|CINK +|CINK KING|CINK PEAX|CINK SLIM|SUBLIM', + 'iMobile' => 'i-mobile (IQ|i-STYLE|idea|ZAA|Hitz)', + // Added simvalley mobile just for fun. They have some interesting devices. + // http://www.simvalley.fr/telephonie---gps-_22_telephonie-mobile_telephones_.html + 'SimValley' => '\b(SP-80|XT-930|SX-340|XT-930|SX-310|SP-360|SP60|SPT-800|SP-120|SPT-800|SP-140|SPX-5|SPX-8|SP-100|SPX-8|SPX-12)\b', + // Wolfgang - a brand that is sold by Aldi supermarkets. + // http://www.wolfgangmobile.com/ + 'Wolfgang' => 'AT-B24D|AT-AS50HD|AT-AS40W|AT-AS55HD|AT-AS45q2|AT-B26D|AT-AS50Q', + 'Alcatel' => 'Alcatel', + 'Nintendo' => 'Nintendo 3DS', + // http://en.wikipedia.org/wiki/Amoi + 'Amoi' => 'Amoi', + // http://en.wikipedia.org/wiki/INQ + 'INQ' => 'INQ', + // @Tapatalk is a mobile app; http://support.tapatalk.com/threads/smf-2-0-2-os-and-browser-detection-plugin-and-tapatalk.15565/#post-79039 + 'GenericPhone' => 'Tapatalk|PDA;|SAGEM|\bmmp\b|pocket|\bpsp\b|symbian|Smartphone|smartfon|treo|up.browser|up.link|vodafone|\bwap\b|nokia|Series40|Series60|S60|SonyEricsson|N900|MAUI.*WAP.*Browser', + ); + + /** + * List of tablet devices. + * + * @var array + */ + protected static $tabletDevices = array( + // @todo: check for mobile friendly emails topic. + 'iPad' => 'iPad|iPad.*Mobile', + // Removed |^.*Android.*Nexus(?!(?:Mobile).)*$ + // @see #442 + 'NexusTablet' => 'Android.*Nexus[\s]+(7|9|10)', + 'SamsungTablet' => 'SAMSUNG.*Tablet|Galaxy.*Tab|SC-01C|GT-P1000|GT-P1003|GT-P1010|GT-P3105|GT-P6210|GT-P6800|GT-P6810|GT-P7100|GT-P7300|GT-P7310|GT-P7500|GT-P7510|SCH-I800|SCH-I815|SCH-I905|SGH-I957|SGH-I987|SGH-T849|SGH-T859|SGH-T869|SPH-P100|GT-P3100|GT-P3108|GT-P3110|GT-P5100|GT-P5110|GT-P6200|GT-P7320|GT-P7511|GT-N8000|GT-P8510|SGH-I497|SPH-P500|SGH-T779|SCH-I705|SCH-I915|GT-N8013|GT-P3113|GT-P5113|GT-P8110|GT-N8010|GT-N8005|GT-N8020|GT-P1013|GT-P6201|GT-P7501|GT-N5100|GT-N5105|GT-N5110|SHV-E140K|SHV-E140L|SHV-E140S|SHV-E150S|SHV-E230K|SHV-E230L|SHV-E230S|SHW-M180K|SHW-M180L|SHW-M180S|SHW-M180W|SHW-M300W|SHW-M305W|SHW-M380K|SHW-M380S|SHW-M380W|SHW-M430W|SHW-M480K|SHW-M480S|SHW-M480W|SHW-M485W|SHW-M486W|SHW-M500W|GT-I9228|SCH-P739|SCH-I925|GT-I9200|GT-P5200|GT-P5210|GT-P5210X|SM-T311|SM-T310|SM-T310X|SM-T210|SM-T210R|SM-T211|SM-P600|SM-P601|SM-P605|SM-P900|SM-P901|SM-T217|SM-T217A|SM-T217S|SM-P6000|SM-T3100|SGH-I467|XE500|SM-T110|GT-P5220|GT-I9200X|GT-N5110X|GT-N5120|SM-P905|SM-T111|SM-T2105|SM-T315|SM-T320|SM-T320X|SM-T321|SM-T520|SM-T525|SM-T530NU|SM-T230NU|SM-T330NU|SM-T900|XE500T1C|SM-P605V|SM-P905V|SM-T337V|SM-T537V|SM-T707V|SM-T807V|SM-P600X|SM-P900X|SM-T210X|SM-T230|SM-T230X|SM-T325|GT-P7503|SM-T531|SM-T330|SM-T530|SM-T705|SM-T705C|SM-T535|SM-T331|SM-T800|SM-T700|SM-T537|SM-T807|SM-P907A|SM-T337A|SM-T537A|SM-T707A|SM-T807A|SM-T237|SM-T807P|SM-P607T|SM-T217T|SM-T337T|SM-T807T|SM-T116NQ|SM-T116BU|SM-P550|SM-T350|SM-T550|SM-T9000|SM-P9000|SM-T705Y|SM-T805|GT-P3113|SM-T710|SM-T810|SM-T815|SM-T360|SM-T533|SM-T113|SM-T335|SM-T715|SM-T560|SM-T670|SM-T677|SM-T377|SM-T567|SM-T357T|SM-T555|SM-T561|SM-T713|SM-T719|SM-T813|SM-T819|SM-T580|SM-T355Y?|SM-T280|SM-T817A|SM-T820|SM-W700|SM-P580|SM-T587|SM-P350|SM-P555M|SM-P355M|SM-T113NU|SM-T815Y', // SCH-P709|SCH-P729|SM-T2558|GT-I9205 - Samsung Mega - treat them like a regular phone. + // http://docs.aws.amazon.com/silk/latest/developerguide/user-agent.html + 'Kindle' => 'Kindle|Silk.*Accelerated|Android.*\b(KFOT|KFTT|KFJWI|KFJWA|KFOTE|KFSOWI|KFTHWI|KFTHWA|KFAPWI|KFAPWA|WFJWAE|KFSAWA|KFSAWI|KFASWI|KFARWI|KFFOWI|KFGIWI|KFMEWI)\b|Android.*Silk/[0-9.]+ like Chrome/[0-9.]+ (?!Mobile)', + // Only the Surface tablets with Windows RT are considered mobile. + // http://msdn.microsoft.com/en-us/library/ie/hh920767(v=vs.85).aspx + 'SurfaceTablet' => 'Windows NT [0-9.]+; ARM;.*(Tablet|ARMBJS)', + // http://shopping1.hp.com/is-bin/INTERSHOP.enfinity/WFS/WW-USSMBPublicStore-Site/en_US/-/USD/ViewStandardCatalog-Browse?CatalogCategoryID=JfIQ7EN5lqMAAAEyDcJUDwMT + 'HPTablet' => 'HP Slate (7|8|10)|HP ElitePad 900|hp-tablet|EliteBook.*Touch|HP 8|Slate 21|HP SlateBook 10', + // Watch out for PadFone, see #132. + // http://www.asus.com/de/Tablets_Mobile/Memo_Pad_Products/ + 'AsusTablet' => '^.*PadFone((?!Mobile).)*$|Transformer|TF101|TF101G|TF300T|TF300TG|TF300TL|TF700T|TF700KL|TF701T|TF810C|ME171|ME301T|ME302C|ME371MG|ME370T|ME372MG|ME172V|ME173X|ME400C|Slider SL101|\bK00F\b|\bK00C\b|\bK00E\b|\bK00L\b|TX201LA|ME176C|ME102A|\bM80TA\b|ME372CL|ME560CG|ME372CG|ME302KL| K010 | K011 | K017 | K01E |ME572C|ME103K|ME170C|ME171C|\bME70C\b|ME581C|ME581CL|ME8510C|ME181C|P01Y|PO1MA|P01Z|\bP027\b', + 'BlackBerryTablet' => 'PlayBook|RIM Tablet', + 'HTCtablet' => 'HTC_Flyer_P512|HTC Flyer|HTC Jetstream|HTC-P715a|HTC EVO View 4G|PG41200|PG09410', + 'MotorolaTablet' => 'xoom|sholest|MZ615|MZ605|MZ505|MZ601|MZ602|MZ603|MZ604|MZ606|MZ607|MZ608|MZ609|MZ615|MZ616|MZ617', + 'NookTablet' => 'Android.*Nook|NookColor|nook browser|BNRV200|BNRV200A|BNTV250|BNTV250A|BNTV400|BNTV600|LogicPD Zoom2', + // http://www.acer.ro/ac/ro/RO/content/drivers + // http://www.packardbell.co.uk/pb/en/GB/content/download (Packard Bell is part of Acer) + // http://us.acer.com/ac/en/US/content/group/tablets + // http://www.acer.de/ac/de/DE/content/models/tablets/ + // Can conflict with Micromax and Motorola phones codes. + 'AcerTablet' => 'Android.*; \b(A100|A101|A110|A200|A210|A211|A500|A501|A510|A511|A700|A701|W500|W500P|W501|W501P|W510|W511|W700|G100|G100W|B1-A71|B1-710|B1-711|A1-810|A1-811|A1-830)\b|W3-810|\bA3-A10\b|\bA3-A11\b|\bA3-A20\b|\bA3-A30', + // http://eu.computers.toshiba-europe.com/innovation/family/Tablets/1098744/banner_id/tablet_footerlink/ + // http://us.toshiba.com/tablets/tablet-finder + // http://www.toshiba.co.jp/regza/tablet/ + 'ToshibaTablet' => 'Android.*(AT100|AT105|AT200|AT205|AT270|AT275|AT300|AT305|AT1S5|AT500|AT570|AT700|AT830)|TOSHIBA.*FOLIO', + // http://www.nttdocomo.co.jp/english/service/developer/smart_phone/technical_info/spec/index.html + // http://www.lg.com/us/tablets + 'LGTablet' => '\bL-06C|LG-V909|LG-V900|LG-V700|LG-V510|LG-V500|LG-V410|LG-V400|LG-VK810\b', + 'FujitsuTablet' => 'Android.*\b(F-01D|F-02F|F-05E|F-10D|M532|Q572)\b', + // Prestigio Tablets http://www.prestigio.com/support + 'PrestigioTablet' => 'PMP3170B|PMP3270B|PMP3470B|PMP7170B|PMP3370B|PMP3570C|PMP5870C|PMP3670B|PMP5570C|PMP5770D|PMP3970B|PMP3870C|PMP5580C|PMP5880D|PMP5780D|PMP5588C|PMP7280C|PMP7280C3G|PMP7280|PMP7880D|PMP5597D|PMP5597|PMP7100D|PER3464|PER3274|PER3574|PER3884|PER5274|PER5474|PMP5097CPRO|PMP5097|PMP7380D|PMP5297C|PMP5297C_QUAD|PMP812E|PMP812E3G|PMP812F|PMP810E|PMP880TD|PMT3017|PMT3037|PMT3047|PMT3057|PMT7008|PMT5887|PMT5001|PMT5002', + // http://support.lenovo.com/en_GB/downloads/default.page?# + 'LenovoTablet' => 'Lenovo TAB|Idea(Tab|Pad)( A1|A10| K1|)|ThinkPad([ ]+)?Tablet|YT3-850M|YT3-X90L|YT3-X90F|YT3-X90X|Lenovo.*(S2109|S2110|S5000|S6000|K3011|A3000|A3500|A1000|A2107|A2109|A1107|A5500|A7600|B6000|B8000|B8080)(-|)(FL|F|HV|H|)|TB-X103F|TB-X304F|TB-8703F', + // http://www.dell.com/support/home/us/en/04/Products/tab_mob/tablets + 'DellTablet' => 'Venue 11|Venue 8|Venue 7|Dell Streak 10|Dell Streak 7', + // http://www.yarvik.com/en/matrix/tablets/ + 'YarvikTablet' => 'Android.*\b(TAB210|TAB211|TAB224|TAB250|TAB260|TAB264|TAB310|TAB360|TAB364|TAB410|TAB411|TAB420|TAB424|TAB450|TAB460|TAB461|TAB464|TAB465|TAB467|TAB468|TAB07-100|TAB07-101|TAB07-150|TAB07-151|TAB07-152|TAB07-200|TAB07-201-3G|TAB07-210|TAB07-211|TAB07-212|TAB07-214|TAB07-220|TAB07-400|TAB07-485|TAB08-150|TAB08-200|TAB08-201-3G|TAB08-201-30|TAB09-100|TAB09-211|TAB09-410|TAB10-150|TAB10-201|TAB10-211|TAB10-400|TAB10-410|TAB13-201|TAB274EUK|TAB275EUK|TAB374EUK|TAB462EUK|TAB474EUK|TAB9-200)\b', + 'MedionTablet' => 'Android.*\bOYO\b|LIFE.*(P9212|P9514|P9516|S9512)|LIFETAB', + 'ArnovaTablet' => '97G4|AN10G2|AN7bG3|AN7fG3|AN8G3|AN8cG3|AN7G3|AN9G3|AN7dG3|AN7dG3ST|AN7dG3ChildPad|AN10bG3|AN10bG3DT|AN9G2', + // http://www.intenso.de/kategorie_en.php?kategorie=33 + // @todo: http://www.nbhkdz.com/read/b8e64202f92a2df129126bff.html - investigate + 'IntensoTablet' => 'INM8002KP|INM1010FP|INM805ND|Intenso Tab|TAB1004', + // IRU.ru Tablets http://www.iru.ru/catalog/soho/planetable/ + 'IRUTablet' => 'M702pro', + 'MegafonTablet' => 'MegaFon V9|\bZTE V9\b|Android.*\bMT7A\b', + // http://www.e-boda.ro/tablete-pc.html + 'EbodaTablet' => 'E-Boda (Supreme|Impresspeed|Izzycomm|Essential)', + // http://www.allview.ro/produse/droseries/lista-tablete-pc/ + 'AllViewTablet' => 'Allview.*(Viva|Alldro|City|Speed|All TV|Frenzy|Quasar|Shine|TX1|AX1|AX2)', + // http://wiki.archosfans.com/index.php?title=Main_Page + // @note Rewrite the regex format after we add more UAs. + 'ArchosTablet' => '\b(101G9|80G9|A101IT)\b|Qilive 97R|Archos5|\bARCHOS (70|79|80|90|97|101|FAMILYPAD|)(b|c|)(G10| Cobalt| TITANIUM(HD|)| Xenon| Neon|XSK| 2| XS 2| PLATINUM| CARBON|GAMEPAD)\b', + // http://www.ainol.com/plugin.php?identifier=ainol&module=product + 'AinolTablet' => 'NOVO7|NOVO8|NOVO10|Novo7Aurora|Novo7Basic|NOVO7PALADIN|novo9-Spark', + 'NokiaLumiaTablet' => 'Lumia 2520', + // @todo: inspect http://esupport.sony.com/US/p/select-system.pl?DIRECTOR=DRIVER + // Readers http://www.atsuhiro-me.net/ebook/sony-reader/sony-reader-web-browser + // http://www.sony.jp/support/tablet/ + 'SonyTablet' => 'Sony.*Tablet|Xperia Tablet|Sony Tablet S|SO-03E|SGPT12|SGPT13|SGPT114|SGPT121|SGPT122|SGPT123|SGPT111|SGPT112|SGPT113|SGPT131|SGPT132|SGPT133|SGPT211|SGPT212|SGPT213|SGP311|SGP312|SGP321|EBRD1101|EBRD1102|EBRD1201|SGP351|SGP341|SGP511|SGP512|SGP521|SGP541|SGP551|SGP621|SGP612|SOT31', + // http://www.support.philips.com/support/catalog/worldproducts.jsp?userLanguage=en&userCountry=cn&categoryid=3G_LTE_TABLET_SU_CN_CARE&title=3G%20tablets%20/%20LTE%20range&_dyncharset=UTF-8 + 'PhilipsTablet' => '\b(PI2010|PI3000|PI3100|PI3105|PI3110|PI3205|PI3210|PI3900|PI4010|PI7000|PI7100)\b', + // db + http://www.cube-tablet.com/buy-products.html + 'CubeTablet' => 'Android.*(K8GT|U9GT|U10GT|U16GT|U17GT|U18GT|U19GT|U20GT|U23GT|U30GT)|CUBE U8GT', + // http://www.cobyusa.com/?p=pcat&pcat_id=3001 + 'CobyTablet' => 'MID1042|MID1045|MID1125|MID1126|MID7012|MID7014|MID7015|MID7034|MID7035|MID7036|MID7042|MID7048|MID7127|MID8042|MID8048|MID8127|MID9042|MID9740|MID9742|MID7022|MID7010', + // http://www.match.net.cn/products.asp + 'MIDTablet' => 'M9701|M9000|M9100|M806|M1052|M806|T703|MID701|MID713|MID710|MID727|MID760|MID830|MID728|MID933|MID125|MID810|MID732|MID120|MID930|MID800|MID731|MID900|MID100|MID820|MID735|MID980|MID130|MID833|MID737|MID960|MID135|MID860|MID736|MID140|MID930|MID835|MID733|MID4X10', + // http://www.msi.com/support + // @todo Research the Windows Tablets. + 'MSITablet' => 'MSI \b(Primo 73K|Primo 73L|Primo 81L|Primo 77|Primo 93|Primo 75|Primo 76|Primo 73|Primo 81|Primo 91|Primo 90|Enjoy 71|Enjoy 7|Enjoy 10)\b', + // @todo http://www.kyoceramobile.com/support/drivers/ + // 'KyoceraTablet' => null, + // @todo http://intexuae.com/index.php/category/mobile-devices/tablets-products/ + // 'IntextTablet' => null, + // http://pdadb.net/index.php?m=pdalist&list=SMiT (NoName Chinese Tablets) + // http://www.imp3.net/14/show.php?itemid=20454 + 'SMiTTablet' => 'Android.*(\bMID\b|MID-560|MTV-T1200|MTV-PND531|MTV-P1101|MTV-PND530)', + // http://www.rock-chips.com/index.php?do=prod&pid=2 + 'RockChipTablet' => 'Android.*(RK2818|RK2808A|RK2918|RK3066)|RK2738|RK2808A', + // http://www.fly-phone.com/devices/tablets/ ; http://www.fly-phone.com/service/ + 'FlyTablet' => 'IQ310|Fly Vision', + // http://www.bqreaders.com/gb/tablets-prices-sale.html + 'bqTablet' => 'Android.*(bq)?.*(Elcano|Curie|Edison|Maxwell|Kepler|Pascal|Tesla|Hypatia|Platon|Newton|Livingstone|Cervantes|Avant|Aquaris ([E|M]10|M8))|Maxwell.*Lite|Maxwell.*Plus', + // http://www.huaweidevice.com/worldwide/productFamily.do?method=index&directoryId=5011&treeId=3290 + // http://www.huaweidevice.com/worldwide/downloadCenter.do?method=index&directoryId=3372&treeId=0&tb=1&type=software (including legacy tablets) + 'HuaweiTablet' => 'MediaPad|MediaPad 7 Youth|IDEOS S7|S7-201c|S7-202u|S7-101|S7-103|S7-104|S7-105|S7-106|S7-201|S7-Slim|M2-A01L', + // Nec or Medias Tab + 'NecTablet' => '\bN-06D|\bN-08D', + // Pantech Tablets: http://www.pantechusa.com/phones/ + 'PantechTablet' => 'Pantech.*P4100', + // Broncho Tablets: http://www.broncho.cn/ (hard to find) + 'BronchoTablet' => 'Broncho.*(N701|N708|N802|a710)', + // http://versusuk.com/support.html + 'VersusTablet' => 'TOUCHPAD.*[78910]|\bTOUCHTAB\b', + // http://www.zync.in/index.php/our-products/tablet-phablets + 'ZyncTablet' => 'z1000|Z99 2G|z99|z930|z999|z990|z909|Z919|z900', + // http://www.positivoinformatica.com.br/www/pessoal/tablet-ypy/ + 'PositivoTablet' => 'TB07STA|TB10STA|TB07FTA|TB10FTA', + // https://www.nabitablet.com/ + 'NabiTablet' => 'Android.*\bNabi', + 'KoboTablet' => 'Kobo Touch|\bK080\b|\bVox\b Build|\bArc\b Build', + // French Danew Tablets http://www.danew.com/produits-tablette.php + 'DanewTablet' => 'DSlide.*\b(700|701R|702|703R|704|802|970|971|972|973|974|1010|1012)\b', + // Texet Tablets and Readers http://www.texet.ru/tablet/ + 'TexetTablet' => 'NaviPad|TB-772A|TM-7045|TM-7055|TM-9750|TM-7016|TM-7024|TM-7026|TM-7041|TM-7043|TM-7047|TM-8041|TM-9741|TM-9747|TM-9748|TM-9751|TM-7022|TM-7021|TM-7020|TM-7011|TM-7010|TM-7023|TM-7025|TM-7037W|TM-7038W|TM-7027W|TM-9720|TM-9725|TM-9737W|TM-1020|TM-9738W|TM-9740|TM-9743W|TB-807A|TB-771A|TB-727A|TB-725A|TB-719A|TB-823A|TB-805A|TB-723A|TB-715A|TB-707A|TB-705A|TB-709A|TB-711A|TB-890HD|TB-880HD|TB-790HD|TB-780HD|TB-770HD|TB-721HD|TB-710HD|TB-434HD|TB-860HD|TB-840HD|TB-760HD|TB-750HD|TB-740HD|TB-730HD|TB-722HD|TB-720HD|TB-700HD|TB-500HD|TB-470HD|TB-431HD|TB-430HD|TB-506|TB-504|TB-446|TB-436|TB-416|TB-146SE|TB-126SE', + // Avoid detecting 'PLAYSTATION 3' as mobile. + 'PlaystationTablet' => 'Playstation.*(Portable|Vita)', + // http://www.trekstor.de/surftabs.html + 'TrekstorTablet' => 'ST10416-1|VT10416-1|ST70408-1|ST702xx-1|ST702xx-2|ST80208|ST97216|ST70104-2|VT10416-2|ST10216-2A|SurfTab', + // http://www.pyleaudio.com/Products.aspx?%2fproducts%2fPersonal-Electronics%2fTablets + 'PyleAudioTablet' => '\b(PTBL10CEU|PTBL10C|PTBL72BC|PTBL72BCEU|PTBL7CEU|PTBL7C|PTBL92BC|PTBL92BCEU|PTBL9CEU|PTBL9CUK|PTBL9C)\b', + // http://www.advandigital.com/index.php?link=content-product&jns=JP001 + // because of the short codenames we have to include whitespaces to reduce the possible conflicts. + 'AdvanTablet' => 'Android.* \b(E3A|T3X|T5C|T5B|T3E|T3C|T3B|T1J|T1F|T2A|T1H|T1i|E1C|T1-E|T5-A|T4|E1-B|T2Ci|T1-B|T1-D|O1-A|E1-A|T1-A|T3A|T4i)\b ', + // http://www.danytech.com/category/tablet-pc + 'DanyTechTablet' => 'Genius Tab G3|Genius Tab S2|Genius Tab Q3|Genius Tab G4|Genius Tab Q4|Genius Tab G-II|Genius TAB GII|Genius TAB GIII|Genius Tab S1', + // http://www.galapad.net/product.html + 'GalapadTablet' => 'Android.*\bG1\b', + // http://www.micromaxinfo.com/tablet/funbook + 'MicromaxTablet' => 'Funbook|Micromax.*\b(P250|P560|P360|P362|P600|P300|P350|P500|P275)\b', + // http://www.karbonnmobiles.com/products_tablet.php + 'KarbonnTablet' => 'Android.*\b(A39|A37|A34|ST8|ST10|ST7|Smart Tab3|Smart Tab2)\b', + // http://www.myallfine.com/Products.asp + 'AllFineTablet' => 'Fine7 Genius|Fine7 Shine|Fine7 Air|Fine8 Style|Fine9 More|Fine10 Joy|Fine11 Wide', + // http://www.proscanvideo.com/products-search.asp?itemClass=TABLET&itemnmbr= + 'PROSCANTablet' => '\b(PEM63|PLT1023G|PLT1041|PLT1044|PLT1044G|PLT1091|PLT4311|PLT4311PL|PLT4315|PLT7030|PLT7033|PLT7033D|PLT7035|PLT7035D|PLT7044K|PLT7045K|PLT7045KB|PLT7071KG|PLT7072|PLT7223G|PLT7225G|PLT7777G|PLT7810K|PLT7849G|PLT7851G|PLT7852G|PLT8015|PLT8031|PLT8034|PLT8036|PLT8080K|PLT8082|PLT8088|PLT8223G|PLT8234G|PLT8235G|PLT8816K|PLT9011|PLT9045K|PLT9233G|PLT9735|PLT9760G|PLT9770G)\b', + // http://www.yonesnav.com/products/products.php + 'YONESTablet' => 'BQ1078|BC1003|BC1077|RK9702|BC9730|BC9001|IT9001|BC7008|BC7010|BC708|BC728|BC7012|BC7030|BC7027|BC7026', + // http://www.cjshowroom.com/eproducts.aspx?classcode=004001001 + // China manufacturer makes tablets for different small brands (eg. http://www.zeepad.net/index.html) + 'ChangJiaTablet' => 'TPC7102|TPC7103|TPC7105|TPC7106|TPC7107|TPC7201|TPC7203|TPC7205|TPC7210|TPC7708|TPC7709|TPC7712|TPC7110|TPC8101|TPC8103|TPC8105|TPC8106|TPC8203|TPC8205|TPC8503|TPC9106|TPC9701|TPC97101|TPC97103|TPC97105|TPC97106|TPC97111|TPC97113|TPC97203|TPC97603|TPC97809|TPC97205|TPC10101|TPC10103|TPC10106|TPC10111|TPC10203|TPC10205|TPC10503', + // http://www.gloryunion.cn/products.asp + // http://www.allwinnertech.com/en/apply/mobile.html + // http://www.ptcl.com.pk/pd_content.php?pd_id=284 (EVOTAB) + // @todo: Softwiner tablets? + // aka. Cute or Cool tablets. Not sure yet, must research to avoid collisions. + 'GUTablet' => 'TX-A1301|TX-M9002|Q702|kf026', // A12R|D75A|D77|D79|R83|A95|A106C|R15|A75|A76|D71|D72|R71|R73|R77|D82|R85|D92|A97|D92|R91|A10F|A77F|W71F|A78F|W78F|W81F|A97F|W91F|W97F|R16G|C72|C73E|K72|K73|R96G + // http://www.pointofview-online.com/showroom.php?shop_mode=product_listing&category_id=118 + 'PointOfViewTablet' => 'TAB-P506|TAB-navi-7-3G-M|TAB-P517|TAB-P-527|TAB-P701|TAB-P703|TAB-P721|TAB-P731N|TAB-P741|TAB-P825|TAB-P905|TAB-P925|TAB-PR945|TAB-PL1015|TAB-P1025|TAB-PI1045|TAB-P1325|TAB-PROTAB[0-9]+|TAB-PROTAB25|TAB-PROTAB26|TAB-PROTAB27|TAB-PROTAB26XL|TAB-PROTAB2-IPS9|TAB-PROTAB30-IPS9|TAB-PROTAB25XXL|TAB-PROTAB26-IPS10|TAB-PROTAB30-IPS10', + // http://www.overmax.pl/pl/katalog-produktow,p8/tablety,c14/ + // @todo: add more tests. + 'OvermaxTablet' => 'OV-(SteelCore|NewBase|Basecore|Baseone|Exellen|Quattor|EduTab|Solution|ACTION|BasicTab|TeddyTab|MagicTab|Stream|TB-08|TB-09)|Qualcore 1027', + // http://hclmetablet.com/India/index.php + 'HCLTablet' => 'HCL.*Tablet|Connect-3G-2.0|Connect-2G-2.0|ME Tablet U1|ME Tablet U2|ME Tablet G1|ME Tablet X1|ME Tablet Y2|ME Tablet Sync', + // http://www.edigital.hu/Tablet_es_e-book_olvaso/Tablet-c18385.html + 'DPSTablet' => 'DPS Dream 9|DPS Dual 7', + // http://www.visture.com/index.asp + 'VistureTablet' => 'V97 HD|i75 3G|Visture V4( HD)?|Visture V5( HD)?|Visture V10', + // http://www.mijncresta.nl/tablet + 'CrestaTablet' => 'CTP(-)?810|CTP(-)?818|CTP(-)?828|CTP(-)?838|CTP(-)?888|CTP(-)?978|CTP(-)?980|CTP(-)?987|CTP(-)?988|CTP(-)?989', + // MediaTek - http://www.mediatek.com/_en/01_products/02_proSys.php?cata_sn=1&cata1_sn=1&cata2_sn=309 + 'MediatekTablet' => '\bMT8125|MT8389|MT8135|MT8377\b', + // Concorde tab + 'ConcordeTablet' => 'Concorde([ ]+)?Tab|ConCorde ReadMan', + // GoClever Tablets - http://www.goclever.com/uk/products,c1/tablet,c5/ + 'GoCleverTablet' => 'GOCLEVER TAB|A7GOCLEVER|M1042|M7841|M742|R1042BK|R1041|TAB A975|TAB A7842|TAB A741|TAB A741L|TAB M723G|TAB M721|TAB A1021|TAB I921|TAB R721|TAB I720|TAB T76|TAB R70|TAB R76.2|TAB R106|TAB R83.2|TAB M813G|TAB I721|GCTA722|TAB I70|TAB I71|TAB S73|TAB R73|TAB R74|TAB R93|TAB R75|TAB R76.1|TAB A73|TAB A93|TAB A93.2|TAB T72|TAB R83|TAB R974|TAB R973|TAB A101|TAB A103|TAB A104|TAB A104.2|R105BK|M713G|A972BK|TAB A971|TAB R974.2|TAB R104|TAB R83.3|TAB A1042', + // Modecom Tablets - http://www.modecom.eu/tablets/portal/ + 'ModecomTablet' => 'FreeTAB 9000|FreeTAB 7.4|FreeTAB 7004|FreeTAB 7800|FreeTAB 2096|FreeTAB 7.5|FreeTAB 1014|FreeTAB 1001 |FreeTAB 8001|FreeTAB 9706|FreeTAB 9702|FreeTAB 7003|FreeTAB 7002|FreeTAB 1002|FreeTAB 7801|FreeTAB 1331|FreeTAB 1004|FreeTAB 8002|FreeTAB 8014|FreeTAB 9704|FreeTAB 1003', + // Vonino Tablets - http://www.vonino.eu/tablets + 'VoninoTablet' => '\b(Argus[ _]?S|Diamond[ _]?79HD|Emerald[ _]?78E|Luna[ _]?70C|Onyx[ _]?S|Onyx[ _]?Z|Orin[ _]?HD|Orin[ _]?S|Otis[ _]?S|SpeedStar[ _]?S|Magnet[ _]?M9|Primus[ _]?94[ _]?3G|Primus[ _]?94HD|Primus[ _]?QS|Android.*\bQ8\b|Sirius[ _]?EVO[ _]?QS|Sirius[ _]?QS|Spirit[ _]?S)\b', + // ECS Tablets - http://www.ecs.com.tw/ECSWebSite/Product/Product_Tablet_List.aspx?CategoryID=14&MenuID=107&childid=M_107&LanID=0 + 'ECSTablet' => 'V07OT2|TM105A|S10OT1|TR10CS1', + // Storex Tablets - http://storex.fr/espace_client/support.html + // @note: no need to add all the tablet codes since they are guided by the first regex. + 'StorexTablet' => 'eZee[_\']?(Tab|Go)[0-9]+|TabLC7|Looney Tunes Tab', + // Generic Vodafone tablets. + 'VodafoneTablet' => 'SmartTab([ ]+)?[0-9]+|SmartTabII10|SmartTabII7|VF-1497', + // French tablets - Essentiel B http://www.boulanger.fr/tablette_tactile_e-book/tablette_tactile_essentiel_b/cl_68908.htm?multiChoiceToDelete=brand&mc_brand=essentielb + // Aka: http://www.essentielb.fr/ + 'EssentielBTablet' => 'Smart[ \']?TAB[ ]+?[0-9]+|Family[ \']?TAB2', + // Ross & Moor - http://ross-moor.ru/ + 'RossMoorTablet' => 'RM-790|RM-997|RMD-878G|RMD-974R|RMT-705A|RMT-701|RME-601|RMT-501|RMT-711', + // i-mobile http://product.i-mobilephone.com/Mobile_Device + 'iMobileTablet' => 'i-mobile i-note', + // http://www.tolino.de/de/vergleichen/ + 'TolinoTablet' => 'tolino tab [0-9.]+|tolino shine', + // AudioSonic - a Kmart brand + // http://www.kmart.com.au/webapp/wcs/stores/servlet/Search?langId=-1&storeId=10701&catalogId=10001&categoryId=193001&pageSize=72¤tPage=1&searchCategory=193001%2b4294965664&sortBy=p_MaxPrice%7c1 + 'AudioSonicTablet' => '\bC-22Q|T7-QC|T-17B|T-17P\b', + // AMPE Tablets - http://www.ampe.com.my/product-category/tablets/ + // @todo: add them gradually to avoid conflicts. + 'AMPETablet' => 'Android.* A78 ', + // Skk Mobile - http://skkmobile.com.ph/product_tablets.php + 'SkkTablet' => 'Android.* (SKYPAD|PHOENIX|CYCLOPS)', + // Tecno Mobile (only tablet) - http://www.tecno-mobile.com/index.php/product?filterby=smart&list_order=all&page=1 + 'TecnoTablet' => 'TECNO P9', + // JXD (consoles & tablets) - http://jxd.hk/products.asp?selectclassid=009008&clsid=3 + 'JXDTablet' => 'Android.* \b(F3000|A3300|JXD5000|JXD3000|JXD2000|JXD300B|JXD300|S5800|S7800|S602b|S5110b|S7300|S5300|S602|S603|S5100|S5110|S601|S7100a|P3000F|P3000s|P101|P200s|P1000m|P200m|P9100|P1000s|S6600b|S908|P1000|P300|S18|S6600|S9100)\b', + // i-Joy tablets - http://www.i-joy.es/en/cat/products/tablets/ + 'iJoyTablet' => 'Tablet (Spirit 7|Essentia|Galatea|Fusion|Onix 7|Landa|Titan|Scooby|Deox|Stella|Themis|Argon|Unique 7|Sygnus|Hexen|Finity 7|Cream|Cream X2|Jade|Neon 7|Neron 7|Kandy|Scape|Saphyr 7|Rebel|Biox|Rebel|Rebel 8GB|Myst|Draco 7|Myst|Tab7-004|Myst|Tadeo Jones|Tablet Boing|Arrow|Draco Dual Cam|Aurix|Mint|Amity|Revolution|Finity 9|Neon 9|T9w|Amity 4GB Dual Cam|Stone 4GB|Stone 8GB|Andromeda|Silken|X2|Andromeda II|Halley|Flame|Saphyr 9,7|Touch 8|Planet|Triton|Unique 10|Hexen 10|Memphis 4GB|Memphis 8GB|Onix 10)', + // http://www.intracon.eu/tablet + 'FX2Tablet' => 'FX2 PAD7|FX2 PAD10', + // http://www.xoro.de/produkte/ + // @note: Might be the same brand with 'Simply tablets' + 'XoroTablet' => 'KidsPAD 701|PAD[ ]?712|PAD[ ]?714|PAD[ ]?716|PAD[ ]?717|PAD[ ]?718|PAD[ ]?720|PAD[ ]?721|PAD[ ]?722|PAD[ ]?790|PAD[ ]?792|PAD[ ]?900|PAD[ ]?9715D|PAD[ ]?9716DR|PAD[ ]?9718DR|PAD[ ]?9719QR|PAD[ ]?9720QR|TelePAD1030|Telepad1032|TelePAD730|TelePAD731|TelePAD732|TelePAD735Q|TelePAD830|TelePAD9730|TelePAD795|MegaPAD 1331|MegaPAD 1851|MegaPAD 2151', + // http://www1.viewsonic.com/products/computing/tablets/ + 'ViewsonicTablet' => 'ViewPad 10pi|ViewPad 10e|ViewPad 10s|ViewPad E72|ViewPad7|ViewPad E100|ViewPad 7e|ViewSonic VB733|VB100a', + // https://www.verizonwireless.com/tablets/verizon/ + 'VerizonTablet' => 'QTAQZ3|QTAIR7|QTAQTZ3|QTASUN1|QTASUN2|QTAXIA1', + // http://www.odys.de/web/internet-tablet_en.html + 'OdysTablet' => 'LOOX|XENO10|ODYS[ -](Space|EVO|Xpress|NOON)|\bXELIO\b|Xelio10Pro|XELIO7PHONETAB|XELIO10EXTREME|XELIOPT2|NEO_QUAD10', + // http://www.captiva-power.de/products.html#tablets-en + 'CaptivaTablet' => 'CAPTIVA PAD', + // IconBIT - http://www.iconbit.com/products/tablets/ + 'IconbitTablet' => 'NetTAB|NT-3702|NT-3702S|NT-3702S|NT-3603P|NT-3603P|NT-0704S|NT-0704S|NT-3805C|NT-3805C|NT-0806C|NT-0806C|NT-0909T|NT-0909T|NT-0907S|NT-0907S|NT-0902S|NT-0902S', + // http://www.teclast.com/topic.php?channelID=70&topicID=140&pid=63 + 'TeclastTablet' => 'T98 4G|\bP80\b|\bX90HD\b|X98 Air|X98 Air 3G|\bX89\b|P80 3G|\bX80h\b|P98 Air|\bX89HD\b|P98 3G|\bP90HD\b|P89 3G|X98 3G|\bP70h\b|P79HD 3G|G18d 3G|\bP79HD\b|\bP89s\b|\bA88\b|\bP10HD\b|\bP19HD\b|G18 3G|\bP78HD\b|\bA78\b|\bP75\b|G17s 3G|G17h 3G|\bP85t\b|\bP90\b|\bP11\b|\bP98t\b|\bP98HD\b|\bG18d\b|\bP85s\b|\bP11HD\b|\bP88s\b|\bA80HD\b|\bA80se\b|\bA10h\b|\bP89\b|\bP78s\b|\bG18\b|\bP85\b|\bA70h\b|\bA70\b|\bG17\b|\bP18\b|\bA80s\b|\bA11s\b|\bP88HD\b|\bA80h\b|\bP76s\b|\bP76h\b|\bP98\b|\bA10HD\b|\bP78\b|\bP88\b|\bA11\b|\bA10t\b|\bP76a\b|\bP76t\b|\bP76e\b|\bP85HD\b|\bP85a\b|\bP86\b|\bP75HD\b|\bP76v\b|\bA12\b|\bP75a\b|\bA15\b|\bP76Ti\b|\bP81HD\b|\bA10\b|\bT760VE\b|\bT720HD\b|\bP76\b|\bP73\b|\bP71\b|\bP72\b|\bT720SE\b|\bC520Ti\b|\bT760\b|\bT720VE\b|T720-3GE|T720-WiFi', + // Onda - http://www.onda-tablet.com/buy-android-onda.html?dir=desc&limit=all&order=price + 'OndaTablet' => '\b(V975i|Vi30|VX530|V701|Vi60|V701s|Vi50|V801s|V719|Vx610w|VX610W|V819i|Vi10|VX580W|Vi10|V711s|V813|V811|V820w|V820|Vi20|V711|VI30W|V712|V891w|V972|V819w|V820w|Vi60|V820w|V711|V813s|V801|V819|V975s|V801|V819|V819|V818|V811|V712|V975m|V101w|V961w|V812|V818|V971|V971s|V919|V989|V116w|V102w|V973|Vi40)\b[\s]+', + 'JaytechTablet' => 'TPC-PA762', + 'BlaupunktTablet' => 'Endeavour 800NG|Endeavour 1010', + // http://www.digma.ru/support/download/ + // @todo: Ebooks also (if requested) + 'DigmaTablet' => '\b(iDx10|iDx9|iDx8|iDx7|iDxD7|iDxD8|iDsQ8|iDsQ7|iDsQ8|iDsD10|iDnD7|3TS804H|iDsQ11|iDj7|iDs10)\b', + // http://www.evolioshop.com/ro/tablete-pc.html + // http://www.evolio.ro/support/downloads_static.html?cat=2 + // @todo: Research some more + 'EvolioTablet' => 'ARIA_Mini_wifi|Aria[ _]Mini|Evolio X10|Evolio X7|Evolio X8|\bEvotab\b|\bNeura\b', + // @todo http://www.lavamobiles.com/tablets-data-cards + 'LavaTablet' => 'QPAD E704|\bIvoryS\b|E-TAB IVORY|\bE-TAB\b', + // http://www.breezetablet.com/ + 'AocTablet' => 'MW0811|MW0812|MW0922|MTK8382|MW1031|MW0831|MW0821|MW0931|MW0712', + // http://www.mpmaneurope.com/en/products/internet-tablets-14/android-tablets-14/ + 'MpmanTablet' => 'MP11 OCTA|MP10 OCTA|MPQC1114|MPQC1004|MPQC994|MPQC974|MPQC973|MPQC804|MPQC784|MPQC780|\bMPG7\b|MPDCG75|MPDCG71|MPDC1006|MP101DC|MPDC9000|MPDC905|MPDC706HD|MPDC706|MPDC705|MPDC110|MPDC100|MPDC99|MPDC97|MPDC88|MPDC8|MPDC77|MP709|MID701|MID711|MID170|MPDC703|MPQC1010', + // https://www.celkonmobiles.com/?_a=categoryphones&sid=2 + 'CelkonTablet' => 'CT695|CT888|CT[\s]?910|CT7 Tab|CT9 Tab|CT3 Tab|CT2 Tab|CT1 Tab|C820|C720|\bCT-1\b', + // http://www.wolderelectronics.com/productos/manuales-y-guias-rapidas/categoria-2-miTab + 'WolderTablet' => 'miTab \b(DIAMOND|SPACE|BROOKLYN|NEO|FLY|MANHATTAN|FUNK|EVOLUTION|SKY|GOCAR|IRON|GENIUS|POP|MINT|EPSILON|BROADWAY|JUMP|HOP|LEGEND|NEW AGE|LINE|ADVANCE|FEEL|FOLLOW|LIKE|LINK|LIVE|THINK|FREEDOM|CHICAGO|CLEVELAND|BALTIMORE-GH|IOWA|BOSTON|SEATTLE|PHOENIX|DALLAS|IN 101|MasterChef)\b', + // http://www.mi.com/en + 'MiTablet' => '\bMI PAD\b|\bHM NOTE 1W\b', + // http://www.nbru.cn/index.html + 'NibiruTablet' => 'Nibiru M1|Nibiru Jupiter One', + // http://navroad.com/products/produkty/tablety/ + // http://navroad.com/products/produkty/tablety/ + 'NexoTablet' => 'NEXO NOVA|NEXO 10|NEXO AVIO|NEXO FREE|NEXO GO|NEXO EVO|NEXO 3G|NEXO SMART|NEXO KIDDO|NEXO MOBI', + // http://leader-online.com/new_site/product-category/tablets/ + // http://www.leader-online.net.au/List/Tablet + 'LeaderTablet' => 'TBLT10Q|TBLT10I|TBL-10WDKB|TBL-10WDKBO2013|TBL-W230V2|TBL-W450|TBL-W500|SV572|TBLT7I|TBA-AC7-8G|TBLT79|TBL-8W16|TBL-10W32|TBL-10WKB|TBL-W100', + // http://www.datawind.com/ubislate/ + 'UbislateTablet' => 'UbiSlate[\s]?7C', + // http://www.pocketbook-int.com/ru/support + 'PocketBookTablet' => 'Pocketbook', + // http://www.kocaso.com/product_tablet.html + 'KocasoTablet' => '\b(TB-1207)\b', + // http://global.hisense.com/product/asia/tablet/Sero7/201412/t20141215_91832.htm + 'HisenseTablet' => '\b(F5281|E2371)\b', + // http://www.tesco.com/direct/hudl/ + 'Hudl' => 'Hudl HT7S3|Hudl 2', + // http://www.telstra.com.au/home-phone/thub-2/ + 'TelstraTablet' => 'T-Hub2', + 'GenericTablet' => 'Android.*\b97D\b|Tablet(?!.*PC)|BNTV250A|MID-WCDMA|LogicPD Zoom2|\bA7EB\b|CatNova8|A1_07|CT704|CT1002|\bM721\b|rk30sdk|\bEVOTAB\b|M758A|ET904|ALUMIUM10|Smartfren Tab|Endeavour 1010|Tablet-PC-4|Tagi Tab|\bM6pro\b|CT1020W|arc 10HD|\bTP750\b|\bQTAQZ3\b' + ); + + /** + * List of mobile Operating Systems. + * + * @var array + */ + protected static $operatingSystems = array( + 'AndroidOS' => 'Android', + 'BlackBerryOS' => 'blackberry|\bBB10\b|rim tablet os', + 'PalmOS' => 'PalmOS|avantgo|blazer|elaine|hiptop|palm|plucker|xiino', + 'SymbianOS' => 'Symbian|SymbOS|Series60|Series40|SYB-[0-9]+|\bS60\b', + // @reference: http://en.wikipedia.org/wiki/Windows_Mobile + 'WindowsMobileOS' => 'Windows CE.*(PPC|Smartphone|Mobile|[0-9]{3}x[0-9]{3})|Window Mobile|Windows Phone [0-9.]+|WCE;', + // @reference: http://en.wikipedia.org/wiki/Windows_Phone + // http://wifeng.cn/?r=blog&a=view&id=106 + // http://nicksnettravels.builttoroam.com/post/2011/01/10/Bogus-Windows-Phone-7-User-Agent-String.aspx + // http://msdn.microsoft.com/library/ms537503.aspx + // https://msdn.microsoft.com/en-us/library/hh869301(v=vs.85).aspx + 'WindowsPhoneOS' => 'Windows Phone 10.0|Windows Phone 8.1|Windows Phone 8.0|Windows Phone OS|XBLWP7|ZuneWP7|Windows NT 6.[23]; ARM;', + 'iOS' => '\biPhone.*Mobile|\biPod|\biPad|AppleCoreMedia', + // http://en.wikipedia.org/wiki/MeeGo + // @todo: research MeeGo in UAs + 'MeeGoOS' => 'MeeGo', + // http://en.wikipedia.org/wiki/Maemo + // @todo: research Maemo in UAs + 'MaemoOS' => 'Maemo', + 'JavaOS' => 'J2ME/|\bMIDP\b|\bCLDC\b', // '|Java/' produces bug #135 + 'webOS' => 'webOS|hpwOS', + 'badaOS' => '\bBada\b', + 'BREWOS' => 'BREW', + ); + + /** + * List of mobile User Agents. + * + * IMPORTANT: This is a list of only mobile browsers. + * Mobile Detect 2.x supports only mobile browsers, + * it was never designed to detect all browsers. + * The change will come in 2017 in the 3.x release for PHP7. + * + * @var array + */ + protected static $browsers = array( + //'Vivaldi' => 'Vivaldi', + // @reference: https://developers.google.com/chrome/mobile/docs/user-agent + 'Chrome' => '\bCrMo\b|CriOS|Android.*Chrome/[.0-9]* (Mobile)?', + 'Dolfin' => '\bDolfin\b', + 'Opera' => 'Opera.*Mini|Opera.*Mobi|Android.*Opera|Mobile.*OPR/[0-9.]+|Coast/[0-9.]+', + 'Skyfire' => 'Skyfire', + 'Edge' => 'Mobile Safari/[.0-9]* Edge', + 'IE' => 'IEMobile|MSIEMobile', // |Trident/[.0-9]+ + 'Firefox' => 'fennec|firefox.*maemo|(Mobile|Tablet).*Firefox|Firefox.*Mobile|FxiOS', + 'Bolt' => 'bolt', + 'TeaShark' => 'teashark', + 'Blazer' => 'Blazer', + // @reference: http://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariWebContent/OptimizingforSafarioniPhone/OptimizingforSafarioniPhone.html#//apple_ref/doc/uid/TP40006517-SW3 + 'Safari' => 'Version.*Mobile.*Safari|Safari.*Mobile|MobileSafari', + // http://en.wikipedia.org/wiki/Midori_(web_browser) + //'Midori' => 'midori', + //'Tizen' => 'Tizen', + 'UCBrowser' => 'UC.*Browser|UCWEB', + 'baiduboxapp' => 'baiduboxapp', + 'baidubrowser' => 'baidubrowser', + // https://github.com/serbanghita/Mobile-Detect/issues/7 + 'DiigoBrowser' => 'DiigoBrowser', + // http://www.puffinbrowser.com/index.php + 'Puffin' => 'Puffin', + // http://mercury-browser.com/index.html + 'Mercury' => '\bMercury\b', + // http://en.wikipedia.org/wiki/Obigo_Browser + 'ObigoBrowser' => 'Obigo', + // http://en.wikipedia.org/wiki/NetFront + 'NetFront' => 'NF-Browser', + // @reference: http://en.wikipedia.org/wiki/Minimo + // http://en.wikipedia.org/wiki/Vision_Mobile_Browser + 'GenericBrowser' => 'NokiaBrowser|OviBrowser|OneBrowser|TwonkyBeamBrowser|SEMC.*Browser|FlyFlow|Minimo|NetFront|Novarra-Vision|MQQBrowser|MicroMessenger', + // @reference: https://en.wikipedia.org/wiki/Pale_Moon_(web_browser) + 'PaleMoon' => 'Android.*PaleMoon|Mobile.*PaleMoon', + ); + + /** + * Utilities. + * + * @var array + */ + protected static $utilities = array( + // Experimental. When a mobile device wants to switch to 'Desktop Mode'. + // http://scottcate.com/technology/windows-phone-8-ie10-desktop-or-mobile/ + // https://github.com/serbanghita/Mobile-Detect/issues/57#issuecomment-15024011 + // https://developers.facebook.com/docs/sharing/best-practices + 'Bot' => 'Googlebot|facebookexternalhit|AdsBot-Google|Google Keyword Suggestion|Facebot|YandexBot|YandexMobileBot|bingbot|ia_archiver|AhrefsBot|Ezooms|GSLFbot|WBSearchBot|Twitterbot|TweetmemeBot|Twikle|PaperLiBot|Wotbox|UnwindFetchor|Exabot|MJ12bot|YandexImages|TurnitinBot|Pingdom', + 'MobileBot' => 'Googlebot-Mobile|AdsBot-Google-Mobile|YahooSeeker/M1A1-R2D2', + 'DesktopMode' => 'WPDesktop', + 'TV' => 'SonyDTV|HbbTV', // experimental + 'WebKit' => '(webkit)[ /]([\w.]+)', + // @todo: Include JXD consoles. + 'Console' => '\b(Nintendo|Nintendo WiiU|Nintendo 3DS|PLAYSTATION|Xbox)\b', + 'Watch' => 'SM-V700', + ); + + /** + * All possible HTTP headers that represent the + * User-Agent string. + * + * @var array + */ + protected static $uaHttpHeaders = array( + // The default User-Agent string. + 'HTTP_USER_AGENT', + // Header can occur on devices using Opera Mini. + 'HTTP_X_OPERAMINI_PHONE_UA', + // Vodafone specific header: http://www.seoprinciple.com/mobile-web-community-still-angry-at-vodafone/24/ + 'HTTP_X_DEVICE_USER_AGENT', + 'HTTP_X_ORIGINAL_USER_AGENT', + 'HTTP_X_SKYFIRE_PHONE', + 'HTTP_X_BOLT_PHONE_UA', + 'HTTP_DEVICE_STOCK_UA', + 'HTTP_X_UCBROWSER_DEVICE_UA' + ); + + /** + * The individual segments that could exist in a User-Agent string. VER refers to the regular + * expression defined in the constant self::VER. + * + * @var array + */ + protected static $properties = array( + + // Build + 'Mobile' => 'Mobile/[VER]', + 'Build' => 'Build/[VER]', + 'Version' => 'Version/[VER]', + 'VendorID' => 'VendorID/[VER]', + + // Devices + 'iPad' => 'iPad.*CPU[a-z ]+[VER]', + 'iPhone' => 'iPhone.*CPU[a-z ]+[VER]', + 'iPod' => 'iPod.*CPU[a-z ]+[VER]', + //'BlackBerry' => array('BlackBerry[VER]', 'BlackBerry [VER];'), + 'Kindle' => 'Kindle/[VER]', + + // Browser + 'Chrome' => array('Chrome/[VER]', 'CriOS/[VER]', 'CrMo/[VER]'), + 'Coast' => array('Coast/[VER]'), + 'Dolfin' => 'Dolfin/[VER]', + // @reference: https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/User-Agent/Firefox + 'Firefox' => array('Firefox/[VER]', 'FxiOS/[VER]'), + 'Fennec' => 'Fennec/[VER]', + // http://msdn.microsoft.com/en-us/library/ms537503(v=vs.85).aspx + // https://msdn.microsoft.com/en-us/library/ie/hh869301(v=vs.85).aspx + 'Edge' => 'Edge/[VER]', + 'IE' => array('IEMobile/[VER];', 'IEMobile [VER]', 'MSIE [VER];', 'Trident/[0-9.]+;.*rv:[VER]'), + // http://en.wikipedia.org/wiki/NetFront + 'NetFront' => 'NetFront/[VER]', + 'NokiaBrowser' => 'NokiaBrowser/[VER]', + 'Opera' => array( ' OPR/[VER]', 'Opera Mini/[VER]', 'Version/[VER]' ), + 'Opera Mini' => 'Opera Mini/[VER]', + 'Opera Mobi' => 'Version/[VER]', + 'UCBrowser' => array( 'UCWEB[VER]', 'UC.*Browser/[VER]' ), + 'MQQBrowser' => 'MQQBrowser/[VER]', + 'MicroMessenger' => 'MicroMessenger/[VER]', + 'baiduboxapp' => 'baiduboxapp/[VER]', + 'baidubrowser' => 'baidubrowser/[VER]', + 'SamsungBrowser' => 'SamsungBrowser/[VER]', + 'Iron' => 'Iron/[VER]', + // @note: Safari 7534.48.3 is actually Version 5.1. + // @note: On BlackBerry the Version is overwriten by the OS. + 'Safari' => array( 'Version/[VER]', 'Safari/[VER]' ), + 'Skyfire' => 'Skyfire/[VER]', + 'Tizen' => 'Tizen/[VER]', + 'Webkit' => 'webkit[ /][VER]', + 'PaleMoon' => 'PaleMoon/[VER]', + + // Engine + 'Gecko' => 'Gecko/[VER]', + 'Trident' => 'Trident/[VER]', + 'Presto' => 'Presto/[VER]', + 'Goanna' => 'Goanna/[VER]', + + // OS + 'iOS' => ' \bi?OS\b [VER][ ;]{1}', + 'Android' => 'Android [VER]', + 'BlackBerry' => array('BlackBerry[\w]+/[VER]', 'BlackBerry.*Version/[VER]', 'Version/[VER]'), + 'BREW' => 'BREW [VER]', + 'Java' => 'Java/[VER]', + // @reference: http://windowsteamblog.com/windows_phone/b/wpdev/archive/2011/08/29/introducing-the-ie9-on-windows-phone-mango-user-agent-string.aspx + // @reference: http://en.wikipedia.org/wiki/Windows_NT#Releases + 'Windows Phone OS' => array( 'Windows Phone OS [VER]', 'Windows Phone [VER]'), + 'Windows Phone' => 'Windows Phone [VER]', + 'Windows CE' => 'Windows CE/[VER]', + // http://social.msdn.microsoft.com/Forums/en-US/windowsdeveloperpreviewgeneral/thread/6be392da-4d2f-41b4-8354-8dcee20c85cd + 'Windows NT' => 'Windows NT [VER]', + 'Symbian' => array('SymbianOS/[VER]', 'Symbian/[VER]'), + 'webOS' => array('webOS/[VER]', 'hpwOS/[VER];'), + ); + + /** + * Construct an instance of this class. + * + * @param array $headers Specify the headers as injection. Should be PHP _SERVER flavored. + * If left empty, will use the global _SERVER['HTTP_*'] vars instead. + * @param string $userAgent Inject the User-Agent header. If null, will use HTTP_USER_AGENT + * from the $headers array instead. + */ + public function __construct( + array $headers = null, + $userAgent = null + ) { + $this->setHttpHeaders($headers); + $this->setUserAgent($userAgent); + } + + /** + * Get the current script version. + * This is useful for the demo.php file, + * so people can check on what version they are testing + * for mobile devices. + * + * @return string The version number in semantic version format. + */ + public static function getScriptVersion() + { + return self::VERSION; + } + + /** + * Set the HTTP Headers. Must be PHP-flavored. This method will reset existing headers. + * + * @param array $httpHeaders The headers to set. If null, then using PHP's _SERVER to extract + * the headers. The default null is left for backwards compatibility. + */ + public function setHttpHeaders($httpHeaders = null) + { + // use global _SERVER if $httpHeaders aren't defined + if (!is_array($httpHeaders) || !count($httpHeaders)) { + $httpHeaders = $_SERVER; + } + + // clear existing headers + $this->httpHeaders = array(); + + // Only save HTTP headers. In PHP land, that means only _SERVER vars that + // start with HTTP_. + foreach ($httpHeaders as $key => $value) { + if (substr($key, 0, 5) === 'HTTP_') { + $this->httpHeaders[$key] = $value; + } + } + + // In case we're dealing with CloudFront, we need to know. + $this->setCfHeaders($httpHeaders); + } + + /** + * Retrieves the HTTP headers. + * + * @return array + */ + public function getHttpHeaders() + { + return $this->httpHeaders; + } + + /** + * Retrieves a particular header. If it doesn't exist, no exception/error is caused. + * Simply null is returned. + * + * @param string $header The name of the header to retrieve. Can be HTTP compliant such as + * "User-Agent" or "X-Device-User-Agent" or can be php-esque with the + * all-caps, HTTP_ prefixed, underscore seperated awesomeness. + * + * @return string|null The value of the header. + */ + public function getHttpHeader($header) + { + // are we using PHP-flavored headers? + if (strpos($header, '_') === false) { + $header = str_replace('-', '_', $header); + $header = strtoupper($header); + } + + // test the alternate, too + $altHeader = 'HTTP_' . $header; + + //Test both the regular and the HTTP_ prefix + if (isset($this->httpHeaders[$header])) { + return $this->httpHeaders[$header]; + } elseif (isset($this->httpHeaders[$altHeader])) { + return $this->httpHeaders[$altHeader]; + } + + return null; + } + + public function getMobileHeaders() + { + return self::$mobileHeaders; + } + + /** + * Get all possible HTTP headers that + * can contain the User-Agent string. + * + * @return array List of HTTP headers. + */ + public function getUaHttpHeaders() + { + return self::$uaHttpHeaders; + } + + + /** + * Set CloudFront headers + * http://docs.aws.amazon.com/AmazonCloudFront/latest/DeveloperGuide/header-caching.html#header-caching-web-device + * + * @param array $cfHeaders List of HTTP headers + * + * @return boolean If there were CloudFront headers to be set + */ + public function setCfHeaders($cfHeaders = null) { + // use global _SERVER if $cfHeaders aren't defined + if (!is_array($cfHeaders) || !count($cfHeaders)) { + $cfHeaders = $_SERVER; + } + + // clear existing headers + $this->cloudfrontHeaders = array(); + + // Only save CLOUDFRONT headers. In PHP land, that means only _SERVER vars that + // start with cloudfront-. + $response = false; + foreach ($cfHeaders as $key => $value) { + if (substr(strtolower($key), 0, 16) === 'http_cloudfront_') { + $this->cloudfrontHeaders[strtoupper($key)] = $value; + $response = true; + } + } + + return $response; + } + + /** + * Retrieves the cloudfront headers. + * + * @return array + */ + public function getCfHeaders() + { + return $this->cloudfrontHeaders; + } + + /** + * @param string $userAgent + * @return string + */ + private function prepareUserAgent($userAgent) { + $userAgent = trim($userAgent); + $userAgent = substr($userAgent, 0, 500); + return $userAgent; + } + + /** + * Set the User-Agent to be used. + * + * @param string $userAgent The user agent string to set. + * + * @return string|null + */ + public function setUserAgent($userAgent = null) + { + // Invalidate cache due to #375 + $this->cache = array(); + + if (false === empty($userAgent)) { + return $this->userAgent = $this->prepareUserAgent($userAgent); + } else { + $this->userAgent = null; + foreach ($this->getUaHttpHeaders() as $altHeader) { + if (false === empty($this->httpHeaders[$altHeader])) { // @todo: should use getHttpHeader(), but it would be slow. (Serban) + $this->userAgent .= $this->httpHeaders[$altHeader] . " "; + } + } + + if (!empty($this->userAgent)) { + return $this->userAgent = $this->prepareUserAgent($this->userAgent); + } + } + + if (count($this->getCfHeaders()) > 0) { + return $this->userAgent = 'Amazon CloudFront'; + } + return $this->userAgent = null; + } + + /** + * Retrieve the User-Agent. + * + * @return string|null The user agent if it's set. + */ + public function getUserAgent() + { + return $this->userAgent; + } + + /** + * Set the detection type. Must be one of self::DETECTION_TYPE_MOBILE or + * self::DETECTION_TYPE_EXTENDED. Otherwise, nothing is set. + * + * @deprecated since version 2.6.9 + * + * @param string $type The type. Must be a self::DETECTION_TYPE_* constant. The default + * parameter is null which will default to self::DETECTION_TYPE_MOBILE. + */ + public function setDetectionType($type = null) + { + if ($type === null) { + $type = self::DETECTION_TYPE_MOBILE; + } + + if ($type !== self::DETECTION_TYPE_MOBILE && $type !== self::DETECTION_TYPE_EXTENDED) { + return; + } + + $this->detectionType = $type; + } + + public function getMatchingRegex() + { + return $this->matchingRegex; + } + + public function getMatchesArray() + { + return $this->matchesArray; + } + + /** + * Retrieve the list of known phone devices. + * + * @return array List of phone devices. + */ + public static function getPhoneDevices() + { + return self::$phoneDevices; + } + + /** + * Retrieve the list of known tablet devices. + * + * @return array List of tablet devices. + */ + public static function getTabletDevices() + { + return self::$tabletDevices; + } + + /** + * Alias for getBrowsers() method. + * + * @return array List of user agents. + */ + public static function getUserAgents() + { + return self::getBrowsers(); + } + + /** + * Retrieve the list of known browsers. Specifically, the user agents. + * + * @return array List of browsers / user agents. + */ + public static function getBrowsers() + { + return self::$browsers; + } + + /** + * Retrieve the list of known utilities. + * + * @return array List of utilities. + */ + public static function getUtilities() + { + return self::$utilities; + } + + /** + * Method gets the mobile detection rules. This method is used for the magic methods $detect->is*(). + * + * @deprecated since version 2.6.9 + * + * @return array All the rules (but not extended). + */ + public static function getMobileDetectionRules() + { + static $rules; + + if (!$rules) { + $rules = array_merge( + self::$phoneDevices, + self::$tabletDevices, + self::$operatingSystems, + self::$browsers + ); + } + + return $rules; + + } + + /** + * Method gets the mobile detection rules + utilities. + * The reason this is separate is because utilities rules + * don't necessary imply mobile. This method is used inside + * the new $detect->is('stuff') method. + * + * @deprecated since version 2.6.9 + * + * @return array All the rules + extended. + */ + public function getMobileDetectionRulesExtended() + { + static $rules; + + if (!$rules) { + // Merge all rules together. + $rules = array_merge( + self::$phoneDevices, + self::$tabletDevices, + self::$operatingSystems, + self::$browsers, + self::$utilities + ); + } + + return $rules; + } + + /** + * Retrieve the current set of rules. + * + * @deprecated since version 2.6.9 + * + * @return array + */ + public function getRules() + { + if ($this->detectionType == self::DETECTION_TYPE_EXTENDED) { + return self::getMobileDetectionRulesExtended(); + } else { + return self::getMobileDetectionRules(); + } + } + + /** + * Retrieve the list of mobile operating systems. + * + * @return array The list of mobile operating systems. + */ + public static function getOperatingSystems() + { + return self::$operatingSystems; + } + + /** + * Check the HTTP headers for signs of mobile. + * This is the fastest mobile check possible; it's used + * inside isMobile() method. + * + * @return bool + */ + public function checkHttpHeadersForMobile() + { + + foreach ($this->getMobileHeaders() as $mobileHeader => $matchType) { + if (isset($this->httpHeaders[$mobileHeader])) { + if (is_array($matchType['matches'])) { + foreach ($matchType['matches'] as $_match) { + if (strpos($this->httpHeaders[$mobileHeader], $_match) !== false) { + return true; + } + } + + return false; + } else { + return true; + } + } + } + + return false; + + } + + /** + * Magic overloading method. + * + * @method boolean is[...]() + * @param string $name + * @param array $arguments + * @return mixed + * @throws BadMethodCallException when the method doesn't exist and doesn't start with 'is' + */ + public function __call($name, $arguments) + { + // make sure the name starts with 'is', otherwise + if (substr($name, 0, 2) !== 'is') { + throw new BadMethodCallException("No such method exists: $name"); + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + $key = substr($name, 2); + + return $this->matchUAAgainstKey($key); + } + + /** + * Find a detection rule that matches the current User-agent. + * + * @param null $userAgent deprecated + * @return boolean + */ + protected function matchDetectionRulesAgainstUA($userAgent = null) + { + // Begin general search. + foreach ($this->getRules() as $_regex) { + if (empty($_regex)) { + continue; + } + + if ($this->match($_regex, $userAgent)) { + return true; + } + } + + return false; + } + + /** + * Search for a certain key in the rules array. + * If the key is found then try to match the corresponding + * regex against the User-Agent. + * + * @param string $key + * + * @return boolean + */ + protected function matchUAAgainstKey($key) + { + // Make the keys lowercase so we can match: isIphone(), isiPhone(), isiphone(), etc. + $key = strtolower($key); + if (false === isset($this->cache[$key])) { + + // change the keys to lower case + $_rules = array_change_key_case($this->getRules()); + + if (false === empty($_rules[$key])) { + $this->cache[$key] = $this->match($_rules[$key]); + } + + if (false === isset($this->cache[$key])) { + $this->cache[$key] = false; + } + } + + return $this->cache[$key]; + } + + /** + * Check if the device is mobile. + * Returns true if any type of mobile device detected, including special ones + * @param null $userAgent deprecated + * @param null $httpHeaders deprecated + * @return bool + */ + public function isMobile($userAgent = null, $httpHeaders = null) + { + + if ($httpHeaders) { + $this->setHttpHeaders($httpHeaders); + } + + if ($userAgent) { + $this->setUserAgent($userAgent); + } + + // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront' + if ($this->getUserAgent() === 'Amazon CloudFront') { + $cfHeaders = $this->getCfHeaders(); + if(array_key_exists('HTTP_CLOUDFRONT_IS_MOBILE_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_MOBILE_VIEWER'] === 'true') { + return true; + } + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + if ($this->checkHttpHeadersForMobile()) { + return true; + } else { + return $this->matchDetectionRulesAgainstUA(); + } + + } + + /** + * Check if the device is a tablet. + * Return true if any type of tablet device is detected. + * + * @param string $userAgent deprecated + * @param array $httpHeaders deprecated + * @return bool + */ + public function isTablet($userAgent = null, $httpHeaders = null) + { + // Check specifically for cloudfront headers if the useragent === 'Amazon CloudFront' + if ($this->getUserAgent() === 'Amazon CloudFront') { + $cfHeaders = $this->getCfHeaders(); + if(array_key_exists('HTTP_CLOUDFRONT_IS_TABLET_VIEWER', $cfHeaders) && $cfHeaders['HTTP_CLOUDFRONT_IS_TABLET_VIEWER'] === 'true') { + return true; + } + } + + $this->setDetectionType(self::DETECTION_TYPE_MOBILE); + + foreach (self::$tabletDevices as $_regex) { + if ($this->match($_regex, $userAgent)) { + return true; + } + } + + return false; + } + + /** + * This method checks for a certain property in the + * userAgent. + * @todo: The httpHeaders part is not yet used. + * + * @param string $key + * @param string $userAgent deprecated + * @param string $httpHeaders deprecated + * @return bool|int|null + */ + public function is($key, $userAgent = null, $httpHeaders = null) + { + // Set the UA and HTTP headers only if needed (eg. batch mode). + if ($httpHeaders) { + $this->setHttpHeaders($httpHeaders); + } + + if ($userAgent) { + $this->setUserAgent($userAgent); + } + + $this->setDetectionType(self::DETECTION_TYPE_EXTENDED); + + return $this->matchUAAgainstKey($key); + } + + /** + * Some detection rules are relative (not standard), + * because of the diversity of devices, vendors and + * their conventions in representing the User-Agent or + * the HTTP headers. + * + * This method will be used to check custom regexes against + * the User-Agent string. + * + * @param $regex + * @param string $userAgent + * @return bool + * + * @todo: search in the HTTP headers too. + */ + public function match($regex, $userAgent = null) + { + $match = (bool) preg_match(sprintf('#%s#is', $regex), (false === empty($userAgent) ? $userAgent : $this->userAgent), $matches); + // If positive match is found, store the results for debug. + if ($match) { + $this->matchingRegex = $regex; + $this->matchesArray = $matches; + } + + return $match; + } + + /** + * Get the properties array. + * + * @return array + */ + public static function getProperties() + { + return self::$properties; + } + + /** + * Prepare the version number. + * + * @todo Remove the error supression from str_replace() call. + * + * @param string $ver The string version, like "2.6.21.2152"; + * + * @return float + */ + public function prepareVersionNo($ver) + { + $ver = str_replace(array('_', ' ', '/'), '.', $ver); + $arrVer = explode('.', $ver, 2); + + if (isset($arrVer[1])) { + $arrVer[1] = @str_replace('.', '', $arrVer[1]); // @todo: treat strings versions. + } + + return (float) implode('.', $arrVer); + } + + /** + * Check the version of the given property in the User-Agent. + * Will return a float number. (eg. 2_0 will return 2.0, 4.3.1 will return 4.31) + * + * @param string $propertyName The name of the property. See self::getProperties() array + * keys for all possible properties. + * @param string $type Either self::VERSION_TYPE_STRING to get a string value or + * self::VERSION_TYPE_FLOAT indicating a float value. This parameter + * is optional and defaults to self::VERSION_TYPE_STRING. Passing an + * invalid parameter will default to the this type as well. + * + * @return string|float The version of the property we are trying to extract. + */ + public function version($propertyName, $type = self::VERSION_TYPE_STRING) + { + if (empty($propertyName)) { + return false; + } + + // set the $type to the default if we don't recognize the type + if ($type !== self::VERSION_TYPE_STRING && $type !== self::VERSION_TYPE_FLOAT) { + $type = self::VERSION_TYPE_STRING; + } + + $properties = self::getProperties(); + + // Check if the property exists in the properties array. + if (true === isset($properties[$propertyName])) { + + // Prepare the pattern to be matched. + // Make sure we always deal with an array (string is converted). + $properties[$propertyName] = (array) $properties[$propertyName]; + + foreach ($properties[$propertyName] as $propertyMatchString) { + + $propertyPattern = str_replace('[VER]', self::VER, $propertyMatchString); + + // Identify and extract the version. + preg_match(sprintf('#%s#is', $propertyPattern), $this->userAgent, $match); + + if (false === empty($match[1])) { + $version = ($type == self::VERSION_TYPE_FLOAT ? $this->prepareVersionNo($match[1]) : $match[1]); + + return $version; + } + + } + + } + + return false; + } + + /** + * Retrieve the mobile grading, using self::MOBILE_GRADE_* constants. + * + * @return string One of the self::MOBILE_GRADE_* constants. + */ + public function mobileGrade() + { + $isMobile = $this->isMobile(); + + if ( + // Apple iOS 4-7.0 – Tested on the original iPad (4.3 / 5.0), iPad 2 (4.3 / 5.1 / 6.1), iPad 3 (5.1 / 6.0), iPad Mini (6.1), iPad Retina (7.0), iPhone 3GS (4.3), iPhone 4 (4.3 / 5.1), iPhone 4S (5.1 / 6.0), iPhone 5 (6.0), and iPhone 5S (7.0) + $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) >= 4.3 || + $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) >= 4.3 || + $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) >= 4.3 || + + // Android 2.1-2.3 - Tested on the HTC Incredible (2.2), original Droid (2.2), HTC Aria (2.1), Google Nexus S (2.3). Functional on 1.5 & 1.6 but performance may be sluggish, tested on Google G1 (1.5) + // Android 3.1 (Honeycomb) - Tested on the Samsung Galaxy Tab 10.1 and Motorola XOOM + // Android 4.0 (ICS) - Tested on a Galaxy Nexus. Note: transition performance can be poor on upgraded devices + // Android 4.1 (Jelly Bean) - Tested on a Galaxy Nexus and Galaxy 7 + ( $this->version('Android', self::VERSION_TYPE_FLOAT)>2.1 && $this->is('Webkit') ) || + + // Windows Phone 7.5-8 - Tested on the HTC Surround (7.5), HTC Trophy (7.5), LG-E900 (7.5), Nokia 800 (7.8), HTC Mazaa (7.8), Nokia Lumia 520 (8), Nokia Lumia 920 (8), HTC 8x (8) + $this->version('Windows Phone OS', self::VERSION_TYPE_FLOAT) >= 7.5 || + + // Tested on the Torch 9800 (6) and Style 9670 (6), BlackBerry® Torch 9810 (7), BlackBerry Z10 (10) + $this->is('BlackBerry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 6.0 || + // Blackberry Playbook (1.0-2.0) - Tested on PlayBook + $this->match('Playbook.*Tablet') || + + // Palm WebOS (1.4-3.0) - Tested on the Palm Pixi (1.4), Pre (1.4), Pre 2 (2.0), HP TouchPad (3.0) + ( $this->version('webOS', self::VERSION_TYPE_FLOAT) >= 1.4 && $this->match('Palm|Pre|Pixi') ) || + // Palm WebOS 3.0 - Tested on HP TouchPad + $this->match('hp.*TouchPad') || + + // Firefox Mobile 18 - Tested on Android 2.3 and 4.1 devices + ( $this->is('Firefox') && $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 18 ) || + + // Chrome for Android - Tested on Android 4.0, 4.1 device + ( $this->is('Chrome') && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 4.0 ) || + + // Skyfire 4.1 - Tested on Android 2.3 device + ( $this->is('Skyfire') && $this->version('Skyfire', self::VERSION_TYPE_FLOAT) >= 4.1 && $this->is('AndroidOS') && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || + + // Opera Mobile 11.5-12: Tested on Android 2.3 + ( $this->is('Opera') && $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11.5 && $this->is('AndroidOS') ) || + + // Meego 1.2 - Tested on Nokia 950 and N9 + $this->is('MeeGoOS') || + + // Tizen (pre-release) - Tested on early hardware + $this->is('Tizen') || + + // Samsung Bada 2.0 - Tested on a Samsung Wave 3, Dolphin browser + // @todo: more tests here! + $this->is('Dolfin') && $this->version('Bada', self::VERSION_TYPE_FLOAT) >= 2.0 || + + // UC Browser - Tested on Android 2.3 device + ( ($this->is('UC Browser') || $this->is('Dolfin')) && $this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 ) || + + // Kindle 3 and Fire - Tested on the built-in WebKit browser for each + ( $this->match('Kindle Fire') || + $this->is('Kindle') && $this->version('Kindle', self::VERSION_TYPE_FLOAT) >= 3.0 ) || + + // Nook Color 1.4.1 - Tested on original Nook Color, not Nook Tablet + $this->is('AndroidOS') && $this->is('NookTablet') || + + // Chrome Desktop 16-24 - Tested on OS X 10.7 and Windows 7 + $this->version('Chrome', self::VERSION_TYPE_FLOAT) >= 16 && !$isMobile || + + // Safari Desktop 5-6 - Tested on OS X 10.7 and Windows 7 + $this->version('Safari', self::VERSION_TYPE_FLOAT) >= 5.0 && !$isMobile || + + // Firefox Desktop 10-18 - Tested on OS X 10.7 and Windows 7 + $this->version('Firefox', self::VERSION_TYPE_FLOAT) >= 10.0 && !$isMobile || + + // Internet Explorer 7-9 - Tested on Windows XP, Vista and 7 + $this->version('IE', self::VERSION_TYPE_FLOAT) >= 7.0 && !$isMobile || + + // Opera Desktop 10-12 - Tested on OS X 10.7 and Windows 7 + $this->version('Opera', self::VERSION_TYPE_FLOAT) >= 10 && !$isMobile + ){ + return self::MOBILE_GRADE_A; + } + + if ( + $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT)<4.3 || + $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT)<4.3 || + $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT)<4.3 || + + // Blackberry 5.0: Tested on the Storm 2 9550, Bold 9770 + $this->is('Blackberry') && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) >= 5 && $this->version('BlackBerry', self::VERSION_TYPE_FLOAT)<6 || + + //Opera Mini (5.0-6.5) - Tested on iOS 3.2/4.3 and Android 2.3 + ($this->version('Opera Mini', self::VERSION_TYPE_FLOAT) >= 5.0 && $this->version('Opera Mini', self::VERSION_TYPE_FLOAT) <= 7.0 && + ($this->version('Android', self::VERSION_TYPE_FLOAT) >= 2.3 || $this->is('iOS')) ) || + + // Nokia Symbian^3 - Tested on Nokia N8 (Symbian^3), C7 (Symbian^3), also works on N97 (Symbian^1) + $this->match('NokiaN8|NokiaC7|N97.*Series60|Symbian/3') || + + // @todo: report this (tested on Nokia N71) + $this->version('Opera Mobi', self::VERSION_TYPE_FLOAT) >= 11 && $this->is('SymbianOS') + ){ + return self::MOBILE_GRADE_B; + } + + if ( + // Blackberry 4.x - Tested on the Curve 8330 + $this->version('BlackBerry', self::VERSION_TYPE_FLOAT) <= 5.0 || + // Windows Mobile - Tested on the HTC Leo (WinMo 5.2) + $this->match('MSIEMobile|Windows CE.*Mobile') || $this->version('Windows Mobile', self::VERSION_TYPE_FLOAT) <= 5.2 || + + // Tested on original iPhone (3.1), iPhone 3 (3.2) + $this->is('iOS') && $this->version('iPad', self::VERSION_TYPE_FLOAT) <= 3.2 || + $this->is('iOS') && $this->version('iPhone', self::VERSION_TYPE_FLOAT) <= 3.2 || + $this->is('iOS') && $this->version('iPod', self::VERSION_TYPE_FLOAT) <= 3.2 || + + // Internet Explorer 7 and older - Tested on Windows XP + $this->version('IE', self::VERSION_TYPE_FLOAT) <= 7.0 && !$isMobile + ){ + return self::MOBILE_GRADE_C; + } + + // All older smartphone platforms and featurephones - Any device that doesn't support media queries + // will receive the basic, C grade experience. + return self::MOBILE_GRADE_C; + } +} diff --git a/2_services/1_metaverse/nodam/application/libraries/common/index.html b/2_services/1_metaverse/nodam/application/libraries/common/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/libraries/common/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/libraries/index.html b/2_services/1_metaverse/nodam/application/libraries/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/libraries/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/libraries/public/index.html b/2_services/1_metaverse/nodam/application/libraries/public/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/libraries/public/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/third_party/index.html b/2_services/1_metaverse/nodam/application/third_party/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/third_party/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/third_party/ion_auth/config/index.html b/2_services/1_metaverse/nodam/application/third_party/ion_auth/config/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/third_party/ion_auth/config/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/third_party/ion_auth/config/ion_auth.php b/2_services/1_metaverse/nodam/application/third_party/ion_auth/config/ion_auth.php new file mode 100644 index 0000000000000000000000000000000000000000..fef255dcddf516a50744e511766eccc54ab34b37 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/third_party/ion_auth/config/ion_auth.php @@ -0,0 +1,186 @@ +ion_auth->is_max_login_attempts_exceeded(). + | The controller should check this function and act + | appropriately. If this variable set to 0, there is no maximum. + */ +$config['site_title'] = "Example.com"; // Site Title, example.com +$config['admin_email'] = "admin@example.com"; // Admin Email, admin@example.com +$config['default_group'] = 'members'; // Default group, use name +$config['admin_group'] = 'admin'; // Default administrators group, use name +$config['identity'] = 'email'; // You can use any unique column in your table as identity column. The values in this column, alongside password, will be used for login purposes +$config['min_password_length'] = 8; // Minimum Required Length of Password +$config['max_password_length'] = 20; // Maximum Allowed Length of Password +$config['email_activation'] = FALSE; // Email Activation for registration +$config['manual_activation'] = FALSE; // Manual Activation for registration +$config['remember_users'] = TRUE; // Allow users to be remembered and enable auto-login +$config['user_expire'] = 86500; // How long to remember the user (seconds). Set to zero for no expiration +$config['user_extend_on_login'] = FALSE; // Extend the users cookies every time they auto-login +$config['track_login_attempts'] = TRUE; // Track the number of failed login attempts for each user or ip. +$config['track_login_ip_address'] = TRUE; // Track login attempts by IP Address, if FALSE will track based on identity. (Default: TRUE) +$config['maximum_login_attempts'] = 3; // The maximum number of failed login attempts. +$config['lockout_time'] = 600; /* The number of seconds to lockout an account due to exceeded attempts + You should not use a value below 60 (1 minute) */ +$config['forgot_password_expiration'] = 0; // The number of seconds after which a forgot password request will expire. If set to 0, forgot password requests will not expire. +$config['recheck_timer'] = 0; /* The number of seconds after which the session is checked again against database to see if the user still exists and is active. + Leave 0 if you don't want session recheck. if you really think you need to recheck the session against database, we would + recommend a higher value, as this would affect performance */ + +/* + | ------------------------------------------------------------------------- + | Cookie options. + | ------------------------------------------------------------------------- + | remember_cookie_name Default: remember_code + | identity_cookie_name Default: identity + */ +$config['remember_cookie_name'] = 'remember_code'; +$config['identity_cookie_name'] = 'identity'; + +/* + | ------------------------------------------------------------------------- + | Email options. + | ------------------------------------------------------------------------- + | email_config: + | 'file' = Use the default CI config or use from a config file + | array = Manually set your email config settings + */ +$config['use_ci_email'] = FALSE; // Send Email using the builtin CI email class, if false it will return the code and the identity +$config['email_config'] = array( + 'mailtype' => 'html', +); + +/* + | ------------------------------------------------------------------------- + | Email templates. + | ------------------------------------------------------------------------- + | Folder where email templates are stored. + | Default: auth/ + */ +$config['email_templates'] = 'auth/email/'; + +/* + | ------------------------------------------------------------------------- + | Activate Account Email Template + | ------------------------------------------------------------------------- + | Default: activate.tpl.php + */ +$config['email_activate'] = 'activate.tpl.php'; + +/* + | ------------------------------------------------------------------------- + | Forgot Password Email Template + | ------------------------------------------------------------------------- + | Default: forgot_password.tpl.php + */ +$config['email_forgot_password'] = 'forgot_password.tpl.php'; + +/* + | ------------------------------------------------------------------------- + | Forgot Password Complete Email Template + | ------------------------------------------------------------------------- + | Default: new_password.tpl.php + */ +$config['email_forgot_password_complete'] = 'new_password.tpl.php'; + +/* + | ------------------------------------------------------------------------- + | Salt options + | ------------------------------------------------------------------------- + | salt_length Default: 22 + | + | store_salt: Should the salt be stored in the database? + | This will change your password encryption algorithm, + | default password, 'password', changes to + | fbaa5e216d163a02ae630ab1a43372635dd374c0 with default salt. + */ +$config['salt_length'] = 22; +$config['store_salt'] = FALSE; + +/* + | ------------------------------------------------------------------------- + | Message Delimiters. + | ------------------------------------------------------------------------- + */ +$config['delimiters_source'] = 'config'; // "config" = use the settings defined here, "form_validation" = use the settings defined in CI's form validation library +$config['message_start_delimiter'] = '

    '; // Message start delimiter +$config['message_end_delimiter'] = '

    '; // Message end delimiter +$config['error_start_delimiter'] = '

    '; // Error message start delimiter +$config['error_end_delimiter'] = '

    '; // Error message end delimiter diff --git a/2_services/1_metaverse/nodam/application/third_party/ion_auth/index.html b/2_services/1_metaverse/nodam/application/third_party/ion_auth/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/third_party/ion_auth/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/third_party/ion_auth/libraries/Bcrypt.php b/2_services/1_metaverse/nodam/application/third_party/ion_auth/libraries/Bcrypt.php new file mode 100644 index 0000000000000000000000000000000000000000..c2ea95abb8f8312aafc226d4c18c4b3e072cb382 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/third_party/ion_auth/libraries/Bcrypt.php @@ -0,0 +1,231 @@ + 7, 'salt_prefix' => '$2y$')) + { + + if (CRYPT_BLOWFISH != 1) + { + throw new Exception("bcrypt not supported in this installation. See http://php.net/crypt"); + } + + $this->rounds = $params['rounds']; + $this->salt_prefix = $params['salt_prefix']; + } + + /** + * @param string $input + * + * @return bool|string + */ + public function hash($input) + { + $hash = crypt($input, $this->getSalt()); + + if (strlen($hash) > 13) + { + return $hash; + } + + return FALSE; + } + + /** + * @param string $input + * @param string $existingHash + * + * @return bool + */ + public function verify($input, $existingHash) + { + $hash = crypt($input, $existingHash); + return $this->hashEquals($existingHash, $hash); + } + + /** + * Polyfill for hash_equals() + * Code mainly taken from hash_equals() compat function of CodeIgniter 3 + * + * @param string $known_string + * @param string $user_string + * + * @return bool + */ + private function hashEquals($known_string, $user_string) + { + // For CI3 or PHP >= 5.6 + if (function_exists('hash_equals')) + { + return hash_equals($known_string, $user_string); + } + + // For CI2 with PHP < 5.6 + // Code from CI3 https://github.com/bcit-ci/CodeIgniter/blob/develop/system/core/compat/hash.php + if (!is_string($known_string)) + { + trigger_error('hash_equals(): Expected known_string to be a string, ' . strtolower(gettype($known_string)) . ' given', E_USER_WARNING); + return FALSE; + } + else if (!is_string($user_string)) + { + trigger_error('hash_equals(): Expected user_string to be a string, ' . strtolower(gettype($user_string)) . ' given', E_USER_WARNING); + return FALSE; + } + else if (($length = strlen($known_string)) !== strlen($user_string)) + { + return FALSE; + } + + $diff = 0; + for ($i = 0; $i < $length; $i++) + { + $diff |= ord($known_string[$i]) ^ ord($user_string[$i]); + } + + return ($diff === 0); + } + + /** + * @return string + */ + private function getSalt() + { + $salt = sprintf($this->salt_prefix . '%02d$', $this->rounds); + + $bytes = $this->getRandomBytes(16); + + $salt .= $this->encodeBytes($bytes); + + return $salt; + } + + /** + * @param $count + * + * @return string + */ + private function getRandomBytes($count) + { + $bytes = ''; + + if (function_exists('openssl_random_pseudo_bytes') && + (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN')) + { + // OpenSSL slow on Win + $bytes = openssl_random_pseudo_bytes($count); + } + + if ($bytes === '' && @is_readable('/dev/urandom') && + ($hRand = @fopen('/dev/urandom', 'rb')) !== FALSE) + { + $bytes = fread($hRand, $count); + fclose($hRand); + } + + if (strlen($bytes) < $count) + { + $bytes = ''; + + if ($this->randomState === NULL) + { + $this->randomState = microtime(); + if (function_exists('getmypid')) + { + $this->randomState .= getmypid(); + } + } + + for ($i = 0; $i < $count; $i += 16) + { + $this->randomState = md5(microtime() . $this->randomState); + + if (PHP_VERSION >= '5') + { + $bytes .= md5($this->randomState, TRUE); + } + else + { + $bytes .= pack('H*', md5($this->randomState)); + } + } + + $bytes = substr($bytes, 0, $count); + } + + return $bytes; + } + + /** + * @param string $input + * + * @return string + */ + private function encodeBytes($input) + { + // The following is code from the PHP Password Hashing Framework + $itoa64 = './ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789'; + + $output = ''; + $i = 0; + do + { + $c1 = ord($input[$i++]); + $output .= $itoa64[$c1 >> 2]; + $c1 = ($c1 & 0x03) << 4; + if ($i >= 16) + { + $output .= $itoa64[$c1]; + break; + } + + $c2 = ord($input[$i++]); + $c1 |= $c2 >> 4; + $output .= $itoa64[$c1]; + $c1 = ($c2 & 0x0f) << 2; + + $c2 = ord($input[$i++]); + $c1 |= $c2 >> 6; + $output .= $itoa64[$c1]; + $output .= $itoa64[$c2 & 0x3f]; + } while (1); + + return $output; + } +} diff --git a/2_services/1_metaverse/nodam/application/third_party/ion_auth/libraries/Ion_auth.php b/2_services/1_metaverse/nodam/application/third_party/ion_auth/libraries/Ion_auth.php new file mode 100644 index 0000000000000000000000000000000000000000..7a1c260d0d1de39fc763912849ada28b571aaa1d --- /dev/null +++ b/2_services/1_metaverse/nodam/application/third_party/ion_auth/libraries/Ion_auth.php @@ -0,0 +1,563 @@ +config->load('ion_auth', TRUE); + $this->load->library(array('email')); + $this->lang->load('ion_auth'); + $this->load->helper(array('cookie', 'language','url')); + + $this->load->library('session'); + + $this->load->model('ion_auth_model'); + + $this->_cache_user_in_group =& $this->ion_auth_model->_cache_user_in_group; + + $email_config = $this->config->item('email_config', 'ion_auth'); + + if ($this->config->item('use_ci_email', 'ion_auth') && isset($email_config) && is_array($email_config)) + { + $this->email->initialize($email_config); + } + + $this->ion_auth_model->trigger_events('library_constructor'); + } + + /** + * __call + * + * Acts as a simple way to call model methods without loads of stupid alias' + * + * @param string $method + * @param array $arguments + * + * @return mixed + * @throws Exception + */ + public function __call($method, $arguments) + { + if (!method_exists( $this->ion_auth_model, $method) ) + { + throw new Exception('Undefined method Ion_auth::' . $method . '() called'); + } + if($method == 'create_user') + { + return call_user_func_array(array($this, 'register'), $arguments); + } + if($method=='update_user') + { + return call_user_func_array(array($this, 'update'), $arguments); + } + return call_user_func_array( array($this->ion_auth_model, $method), $arguments); + } + + /** + * __get + * + * Enables the use of CI super-global without having to define an extra variable. + * + * I can't remember where I first saw this, so thank you if you are the original author. -Militis + * + * @param string $var + * + * @return mixed + */ + public function __get($var) + { + return get_instance()->$var; + } + + /** + * Forgotten password feature + * + * @param string $identity + * + * @return array|bool + * @author Mathew + */ + public function forgotten_password($identity) + { + if ($this->ion_auth_model->forgotten_password($identity)) + { + // Get user information + $identifier = $this->ion_auth_model->identity_column; // use model identity column, so it can be overridden in a controller + $user = $this->where($identifier, $identity)->where('active', 1)->users()->row(); + + if ($user) + { + $data = array( + 'identity' => $user->{$this->config->item('identity', 'ion_auth')}, + 'forgotten_password_code' => $user->forgotten_password_code + ); + + if (!$this->config->item('use_ci_email', 'ion_auth')) + { + $this->set_message('forgot_password_successful'); + return $data; + } + else + { + $message = $this->load->view($this->config->item('email_templates', 'ion_auth') . $this->config->item('email_forgot_password', 'ion_auth'), $data, TRUE); + $this->email->clear(); + $this->email->from($this->config->item('admin_email', 'ion_auth'), $this->config->item('site_title', 'ion_auth')); + $this->email->to($user->email); + $this->email->subject($this->config->item('site_title', 'ion_auth') . ' - ' . $this->lang->line('email_forgotten_password_subject')); + $this->email->message($message); + + if ($this->email->send()) + { + $this->set_message('forgot_password_successful'); + return TRUE; + } + else + { + $this->set_error('forgot_password_unsuccessful'); + return FALSE; + } + } + } + else + { + $this->set_error('forgot_password_unsuccessful'); + return FALSE; + } + } + else + { + $this->set_error('forgot_password_unsuccessful'); + return FALSE; + } + } + + /** + * forgotten_password_complete + * + * @param string $code + * + * @return array|bool + * @author Mathew + */ + public function forgotten_password_complete($code) + { + $this->ion_auth_model->trigger_events('pre_password_change'); + + $identity = $this->config->item('identity', 'ion_auth'); + $profile = $this->where('forgotten_password_code', $code)->users()->row(); // pass the code to profile + + if (!$profile) + { + $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_unsuccessful')); + $this->set_error('password_change_unsuccessful'); + return FALSE; + } + + $new_password = $this->ion_auth_model->forgotten_password_complete($code, $profile->salt); + + if ($new_password) + { + $data = array( + 'identity' => $profile->{$identity}, + 'new_password' => $new_password + ); + if(!$this->config->item('use_ci_email', 'ion_auth')) + { + $this->set_message('password_change_successful'); + $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_successful')); + return $data; + } + else + { + $message = $this->load->view($this->config->item('email_templates', 'ion_auth').$this->config->item('email_forgot_password_complete', 'ion_auth'), $data, true); + + $this->email->clear(); + $this->email->from($this->config->item('admin_email', 'ion_auth'), $this->config->item('site_title', 'ion_auth')); + $this->email->to($profile->email); + $this->email->subject($this->config->item('site_title', 'ion_auth') . ' - ' . $this->lang->line('email_new_password_subject')); + $this->email->message($message); + + if ($this->email->send()) + { + $this->set_message('password_change_successful'); + $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_successful')); + return TRUE; + } + else + { + $this->set_error('password_change_unsuccessful'); + $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_unsuccessful')); + return FALSE; + } + + } + } + + $this->ion_auth_model->trigger_events(array('post_password_change', 'password_change_unsuccessful')); + return FALSE; + } + + /** + * forgotten_password_check + * + * @param string $code + * + * @return object|bool + * @author Michael + */ + public function forgotten_password_check($code) + { + $profile = $this->where('forgotten_password_code', $code)->users()->row(); // pass the code to profile + + if (!is_object($profile)) + { + $this->set_error('password_change_unsuccessful'); + return FALSE; + } + else + { + if ($this->config->item('forgot_password_expiration', 'ion_auth') > 0) + { + //Make sure it isn't expired + $expiration = $this->config->item('forgot_password_expiration', 'ion_auth'); + if (time() - $profile->forgotten_password_time > $expiration) + { + //it has expired + $this->ion_auth_model->clear_forgotten_password_code($code); + $this->set_error('password_change_unsuccessful'); + return FALSE; + } + } + return $profile; + } + } + + /** + * register + * + * @param string $identity + * @param string $password + * @param string $email + * @param array $additional_data + * @param array $group_ids + * + * @return int|array|bool The new user's ID if e-mail activation is disabled or Ion-Auth e-mail activation was + * completed; or an array of activation details if CI e-mail validation is enabled; or FALSE + * if the operation failed. + * @author Mathew + */ + public function register($identity, $password, $email, $additional_data = array(), $group_ids = array()) + { + $this->ion_auth_model->trigger_events('pre_account_creation'); + + $email_activation = $this->config->item('email_activation', 'ion_auth'); + + $id = $this->ion_auth_model->register($identity, $password, $email, $additional_data, $group_ids); + + if (!$email_activation) + { + if ($id !== FALSE) + { + $this->set_message('account_creation_successful'); + $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_successful')); + return $id; + } + else + { + $this->set_error('account_creation_unsuccessful'); + $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_unsuccessful')); + return FALSE; + } + } + else + { + if (!$id) + { + $this->set_error('account_creation_unsuccessful'); + return FALSE; + } + + // deactivate so the user much follow the activation flow + $deactivate = $this->ion_auth_model->deactivate($id); + + // the deactivate method call adds a message, here we need to clear that + $this->ion_auth_model->clear_messages(); + + + if (!$deactivate) + { + $this->set_error('deactivate_unsuccessful'); + $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_unsuccessful')); + return FALSE; + } + + $activation_code = $this->ion_auth_model->activation_code; + $identity = $this->config->item('identity', 'ion_auth'); + $user = $this->ion_auth_model->user($id)->row(); + + $data = array( + 'identity' => $user->{$identity}, + 'id' => $user->id, + 'email' => $email, + 'activation' => $activation_code, + ); + if(!$this->config->item('use_ci_email', 'ion_auth')) + { + $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_successful', 'activation_email_successful')); + $this->set_message('activation_email_successful'); + return $data; + } + else + { + $message = $this->load->view($this->config->item('email_templates', 'ion_auth').$this->config->item('email_activate', 'ion_auth'), $data, true); + + $this->email->clear(); + $this->email->from($this->config->item('admin_email', 'ion_auth'), $this->config->item('site_title', 'ion_auth')); + $this->email->to($email); + $this->email->subject($this->config->item('site_title', 'ion_auth') . ' - ' . $this->lang->line('email_activation_subject')); + $this->email->message($message); + + if ($this->email->send() === TRUE) + { + $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_successful', 'activation_email_successful')); + $this->set_message('activation_email_successful'); + return $id; + } + + } + + $this->ion_auth_model->trigger_events(array('post_account_creation', 'post_account_creation_unsuccessful', 'activation_email_unsuccessful')); + $this->set_error('activation_email_unsuccessful'); + return FALSE; + } + } + + /** + * Logout + * + * @return true + * @author Mathew + **/ + public function logout() + { + $this->ion_auth_model->trigger_events('logout'); + + $identity = $this->config->item('identity', 'ion_auth'); + + if (substr(CI_VERSION, 0, 1) == '2') + { + $this->session->unset_userdata(array($identity => '', 'id' => '', 'user_id' => '')); + } + else + { + $this->session->unset_userdata(array($identity, 'id', 'user_id')); + } + + // delete the remember me cookies if they exist + if (get_cookie($this->config->item('identity_cookie_name', 'ion_auth'))) + { + delete_cookie($this->config->item('identity_cookie_name', 'ion_auth')); + } + if (get_cookie($this->config->item('remember_cookie_name', 'ion_auth'))) + { + delete_cookie($this->config->item('remember_cookie_name', 'ion_auth')); + } + + // Destroy the session + $this->session->sess_destroy(); + + //Recreate the session + if (substr(CI_VERSION, 0, 1) == '2') + { + $this->session->sess_create(); + } + else + { + if (version_compare(PHP_VERSION, '7.0.0') >= 0) + { + session_start(); + } + $this->session->sess_regenerate(TRUE); + } + + $this->set_message('logout_successful'); + return TRUE; + } + + /** + * Auto logs-in the user if they are remembered + * @return bool Whether the user is logged in + * @author Mathew + **/ + public function logged_in() + { + /* + $this->ion_auth_model->trigger_events('logged_in'); + + $recheck = $this->ion_auth_model->recheck_session(); + + // auto-login the user if they are remembered + if (!$recheck && get_cookie($this->config->item('identity_cookie_name', 'ion_auth')) && get_cookie($this->config->item('remember_cookie_name', 'ion_auth'))) + { + $recheck = $this->ion_auth_model->login_remembered_user(); + } + + return $recheck; + */ + if($this->session->userdata('id') == 'admin@admin.com'){ + return TRUE; + }else{ + return FALSE; + } + } + + /** + * @return int|null The user's ID from the session user data or NULL if not found + * @author jrmadsen67 + **/ + public function get_user_id() + { + $user_id = $this->session->userdata('user_id'); + if (!empty($user_id)) + { + return $user_id; + } + return NULL; + } + + /** + * @param int|string|bool $id + * + * @return bool Whether the user is an administrator + * @author Ben Edmunds + */ + public function is_admin($id = FALSE) + { + //$this->ion_auth_model->trigger_events('is_admin'); + + //$admin_group = $this->config->item('admin_group', 'ion_auth'); + + //return $this->in_group($admin_group, $id); + if($this->session->userdata('id') == 'admin@admin.com'){ + return TRUE; + }else{ + return FALSE; + } + } + + /** + * @param int|string|array $check_group group(s) to check + * @param int|string|bool $id user id + * @param bool $check_all check if all groups is present, or any of the groups + * + * @return bool Whether the/all user(s) with the given ID(s) is/are in the given group + * @author Phil Sturgeon + **/ + public function in_group($check_group, $id = FALSE, $check_all = FALSE) + { + $this->ion_auth_model->trigger_events('in_group'); + + $id || $id = $this->session->userdata('user_id'); + + if (!is_array($check_group)) + { + $check_group = array($check_group); + } + + if (isset($this->_cache_user_in_group[$id])) + { + $groups_array = $this->_cache_user_in_group[$id]; + } + else + { + $users_groups = $this->ion_auth_model->get_users_groups($id)->result(); + $groups_array = array(); + foreach ($users_groups as $group) + { + $groups_array[$group->id] = $group->name; + } + $this->_cache_user_in_group[$id] = $groups_array; + } + foreach ($check_group as $key => $value) + { + $groups = (is_string($value)) ? $groups_array : array_keys($groups_array); + + /** + * if !all (default), in_array + * if all, !in_array + */ + if (in_array($value, $groups) xor $check_all) + { + /** + * if !all (default), true + * if all, false + */ + return !$check_all; + } + } + + /** + * if !all (default), false + * if all, true + */ + return $check_all; + } + +} diff --git a/2_services/1_metaverse/nodam/application/third_party/ion_auth/libraries/index.html b/2_services/1_metaverse/nodam/application/third_party/ion_auth/libraries/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/third_party/ion_auth/libraries/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/_templates/control_sidebar.php b/2_services/1_metaverse/nodam/application/views/admin/_templates/control_sidebar.php new file mode 100644 index 0000000000000000000000000000000000000000..e18fe88150641df1a35deec8d5f98ed66f83e6bd --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/_templates/control_sidebar.php @@ -0,0 +1,72 @@ + + + + +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/_templates/footer.php b/2_services/1_metaverse/nodam/application/views/admin/_templates/footer.php new file mode 100644 index 0000000000000000000000000000000000000000..ca597dcac7a8343fa381a7eaaaed4e679b03d912 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/_templates/footer.php @@ -0,0 +1,35 @@ + + +
    + + © Blossom, Inc. . +
    + + + + + + + + +router->fetch_class() == 'users' && ($this->router->fetch_method() == 'create' OR $this->router->fetch_method() == 'edit')): ?> + + +router->fetch_class() == 'groups' && ($this->router->fetch_method() == 'create' OR $this->router->fetch_method() == 'edit')): ?> + + + + + + + + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/_templates/header.php b/2_services/1_metaverse/nodam/application/views/admin/_templates/header.php new file mode 100644 index 0000000000000000000000000000000000000000..daa2728dac8c8316afec9af1f493ad3f0f2dff2c --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/_templates/header.php @@ -0,0 +1,60 @@ + + + + + + <?php echo $title; ?> + + + + + + + + + + + + + + + + + + + + + + + + + + + + +router->fetch_class() == 'groups' && ($this->router->fetch_method() == 'create' OR $this->router->fetch_method() == 'edit')): ?> + + + + + + + + + + +
    + +
    + diff --git a/2_services/1_metaverse/nodam/application/views/admin/_templates/index.html b/2_services/1_metaverse/nodam/application/views/admin/_templates/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/_templates/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/_templates/main_header.php b/2_services/1_metaverse/nodam/application/views/admin/_templates/main_header.php new file mode 100644 index 0000000000000000000000000000000000000000..3519471c54aaca85709796cf0d96e3cbd4c9d40d --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/_templates/main_header.php @@ -0,0 +1,111 @@ + +
    + + + +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/_templates/main_sidebar.php b/2_services/1_metaverse/nodam/application/views/admin/_templates/main_sidebar.php new file mode 100644 index 0000000000000000000000000000000000000000..4791df84e1dc8d9d3f426a42106a55e2688d9f1a --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/_templates/main_sidebar.php @@ -0,0 +1,74 @@ + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/_templates/template.php b/2_services/1_metaverse/nodam/application/views/admin/_templates/template.php new file mode 100644 index 0000000000000000000000000000000000000000..cfb1acf173dfcec34fb63e08fa9a432cdae6c426 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/_templates/template.php @@ -0,0 +1,38 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/dashboard/index.php b/2_services/1_metaverse/nodam/application/views/admin/dashboard/index.php new file mode 100644 index 0000000000000000000000000000000000000000..e1e1584e3edd694f24c5dd365f9a1b9b8fd625c3 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/dashboard/index.php @@ -0,0 +1,224 @@ + +
    +
    + + +
    +
    +
    + +
    +
    + + + +
    + USERS IN PARK +
    +
    +
    +
    +
    +
    +
    + + + +
    + CHAT +
    +
    +
    + +
    +
    + +
    +
    + +
    +
    +
    +
    +
    +
    +
    +
    +
    +
    + + + +
    + MAP +
    + 시청각실 +
    +
    +
    +
    + 실험실 +
    +
    +
    +
    +
    +
    +
    + + + + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/database/index.html b/2_services/1_metaverse/nodam/application/views/admin/database/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/database/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/database/index.php b/2_services/1_metaverse/nodam/application/views/admin/database/index.php new file mode 100644 index 0000000000000000000000000000000000000000..916e19046cee56be8e574cb9d321d96d867a06b6 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/database/index.php @@ -0,0 +1,74 @@ + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    xxx

    +
    +
    + +

    Platform

    + + +

    Version

    + + + + +

    List Tables

    + + + + + + + + + + + + + + + + +db->field_data($db) as $field):?> + + + + + + + + + + + +
     nametypemax_lengthprimary_key
     
     name; ?>type; ?>max_length; ?>primary_key; ?>
    + + + + + + + + + + +
    +
    +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/files/index.html b/2_services/1_metaverse/nodam/application/views/admin/files/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/files/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/files/index.php b/2_services/1_metaverse/nodam/application/views/admin/files/index.php new file mode 100644 index 0000000000000000000000000000000000000000..a3c202562663b3b0c5a00358503c5c290e50d5ae --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/files/index.php @@ -0,0 +1,33 @@ + + +
    +
    + + +
    + +
    +
    +
    + + + + + + + + +

    + + + + + + +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/files/upload.php b/2_services/1_metaverse/nodam/application/views/admin/files/upload.php new file mode 100644 index 0000000000000000000000000000000000000000..0dc1e5385656643c5273e17acd963a191244ccc4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/files/upload.php @@ -0,0 +1,31 @@ + + +
    +
    + + +
    + +
    +
    +
    + + +
      + $value):?> +
    • :
    • + +
    + +

    + + + + +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/fwords/index.html b/2_services/1_metaverse/nodam/application/views/admin/fwords/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/fwords/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/fwords/index.php b/2_services/1_metaverse/nodam/application/views/admin/fwords/index.php new file mode 100644 index 0000000000000000000000000000000000000000..81e94826bc4ea31780a125c80e16ebdfff1c4e1d --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/fwords/index.php @@ -0,0 +1,176 @@ + +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + +
    금지어상태상태 변경
    +
    +
    +
    +
    +
    +
    + + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/groups/create.php b/2_services/1_metaverse/nodam/application/views/admin/groups/create.php new file mode 100644 index 0000000000000000000000000000000000000000..d602e717721e2b13b67d880fb55e6a5543d421ad --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/groups/create.php @@ -0,0 +1,50 @@ + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    +
    +
    + + + 'form-horizontal', 'id' => 'form-create_group')); ?> +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    +
    +
    + 'submit', 'class' => 'btn btn-primary btn-flat', 'content' => lang('actions_submit'))); ?> + 'reset', 'class' => 'btn btn-warning btn-flat', 'content' => lang('actions_reset'))); ?> + 'btn btn-default btn-flat')); ?> +
    +
    +
    + +
    +
    +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/groups/delete.php b/2_services/1_metaverse/nodam/application/views/admin/groups/delete.php new file mode 100644 index 0000000000000000000000000000000000000000..e4328f7c8dfdc431c815ae825d5f855c5e60e3ab --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/groups/delete.php @@ -0,0 +1,5 @@ + + +

    Groups - Delete

    diff --git a/2_services/1_metaverse/nodam/application/views/admin/groups/edit.php b/2_services/1_metaverse/nodam/application/views/admin/groups/edit.php new file mode 100644 index 0000000000000000000000000000000000000000..20a348a1ba3c2608590afaf83b2a4cc2866c6b40 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/groups/edit.php @@ -0,0 +1,57 @@ + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    +
    +
    + + + 'form-horizontal', 'id' => 'form-edit_group')); ?> +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    +
    +
    + 'submit', 'class' => 'btn btn-primary btn-flat', 'content' => lang('actions_submit'))); ?> + 'reset', 'class' => 'btn btn-warning btn-flat', 'content' => lang('actions_reset'))); ?> + 'btn btn-default btn-flat')); ?> +
    +
    +
    + +
    +
    +
    +
    +
    +
    + diff --git a/2_services/1_metaverse/nodam/application/views/admin/groups/index.html b/2_services/1_metaverse/nodam/application/views/admin/groups/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/groups/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/groups/index.php b/2_services/1_metaverse/nodam/application/views/admin/groups/index.php new file mode 100644 index 0000000000000000000000000000000000000000..c6d7f9a9c6ff65a680deffcde3cd332adc44a245 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/groups/index.php @@ -0,0 +1,45 @@ + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    '. lang('groups_create'), array('class' => 'btn btn-block btn-primary btn-flat')); ?>

    +
    +
    + + + + + + + + + + + + + + + + + + + +
    name, ENT_QUOTES, 'UTF-8'); ?>description, ENT_QUOTES, 'UTF-8'); ?>id, lang('actions_edit')); ?>
    +
    +
    +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/index.html b/2_services/1_metaverse/nodam/application/views/admin/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/license/index.html b/2_services/1_metaverse/nodam/application/views/admin/license/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/license/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/license/index.php b/2_services/1_metaverse/nodam/application/views/admin/license/index.php new file mode 100644 index 0000000000000000000000000000000000000000..ba471e007714deda77d5892fd72fae4baceb47d2 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/license/index.php @@ -0,0 +1,153 @@ + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    domProjects, Inc.

    +
    +
    + +
    +
    + From +
    + domProjects, Inc.
    + 29 rue Pasteur
    + 91380 Chilly-Mazarin
    + France
    + Email: contact@domprojects.com +
    +
    +
    + To +
    + John Doe
    + 10 rue de Cambrais
    + 75010 Paris
    + France
    + Email: john.doe@example.com +
    +
    +
    +

    + Order ID: 4F3S8J
    + Payment Due: 2/22/2014
    + Account: 968-34567 +

    + + +
    +
    + +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    QtyProductSerial #DescriptionSubtotal
    1CodeIgniter100-000-301Framework$0.00
    1Bootstrap110-000-335Framework$0.00
    1jQuery120-000-214Framework$0.00
    1AdminLTE130-000-203Framework$0.00
    +
    +
    + +
    +
    +

    Payment Methods:

    + + + + + + +

    + Etsy doostang zoodles disqus groupon greplin oooj voxy zoodles, weebly ning heekya handango imeem plugg dopplr jibjab, movity jajah plickers sifteo edmodo ifttt zimbra. +

    +
    +
    +

    Amount Due 2/22/2014

    +
    + + + + + + + + + + + + + + + + + + + +
    Subtotal:$0.00
    Tax (19.6%)$0.00
    Shipping:$0.00
    Total:$0.00
    +
    +
    +
    + +
    +
    + Print + + +
    +
    + +
    +
    +
    +
    + +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/medias/index.html b/2_services/1_metaverse/nodam/application/views/admin/medias/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/medias/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/medias/index.php b/2_services/1_metaverse/nodam/application/views/admin/medias/index.php new file mode 100644 index 0000000000000000000000000000000000000000..406cf573c5dad3fcabcb6e5764e1b2bd5e96d6e1 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/medias/index.php @@ -0,0 +1,146 @@ + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    인덱스미션종류경로상세
    index ?>level ?>type == 0 ? '영상' : ($media->type == 1 ? '소리' : '그림')) ?>path ?>index.'\',\''.$media->type.'\',\''.$media->path.'\',\''.$media->level.'\')" class="btn btn-xs btn-default">확인' ?>
    +
    +
    +
    +
    +
    +
    + + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/pictures/index.html b/2_services/1_metaverse/nodam/application/views/admin/pictures/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/pictures/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/pictures/index.php b/2_services/1_metaverse/nodam/application/views/admin/pictures/index.php new file mode 100644 index 0000000000000000000000000000000000000000..4c604c64b78772f99d137dfc7c4bf9f83ba2361e --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/pictures/index.php @@ -0,0 +1,64 @@ + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    순서아이디이름스크린샷
    index ?>id ?>name ?>
    +
    +
    +
    +
    +
    +
    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/prefs/index.html b/2_services/1_metaverse/nodam/application/views/admin/prefs/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/prefs/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/prefs/index.php b/2_services/1_metaverse/nodam/application/views/admin/prefs/index.php new file mode 100644 index 0000000000000000000000000000000000000000..1d5277595c948ea1cab9d5264b855e640649032d --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/prefs/index.php @@ -0,0 +1,21 @@ + + + +
    +
    + + +
    + +
    +
    +
    + + + +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/prefs/interfaces/admin.php b/2_services/1_metaverse/nodam/application/views/admin/prefs/interfaces/admin.php new file mode 100644 index 0000000000000000000000000000000000000000..746af70c1cd188021171d90fe89897aec96e8bdd --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/prefs/interfaces/admin.php @@ -0,0 +1,129 @@ + + +
    +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/prefs/interfaces/index.html b/2_services/1_metaverse/nodam/application/views/admin/prefs/interfaces/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/prefs/interfaces/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/prefs/interfaces/public.php b/2_services/1_metaverse/nodam/application/views/admin/prefs/interfaces/public.php new file mode 100644 index 0000000000000000000000000000000000000000..e19c5309c638a2109aaaa7970256504c3aa84609 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/prefs/interfaces/public.php @@ -0,0 +1,53 @@ + + +
    +
    + + +
    + +
    +
    +
    + +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/questions/index.html b/2_services/1_metaverse/nodam/application/views/admin/questions/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/questions/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/questions/index.php b/2_services/1_metaverse/nodam/application/views/admin/questions/index.php new file mode 100644 index 0000000000000000000000000000000000000000..b86c31e57ea9b77660139dcb203c0d40731020bc --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/questions/index.php @@ -0,0 +1,319 @@ + +
    +
    + + +
    +
    +
    +
    + + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    인덱스미션문제상태상세
    index ?>level ?>question ?>is_active == 1 ? '' : ''?>uid.'\', \''.$question->level.'\', \''.$question->question.'\', \''.(json_decode($question->answers)[0]->a).'\', \''.(json_decode($question->answers)[0]->c).'\', \''.(json_decode($question->answers)[1]->a).'\', \''.(json_decode($question->answers)[1]->c).'\', \''.(json_decode($question->answers)[2]->a).'\', \''.(json_decode($question->answers)[2]->c).'\', \''.$question->explain.'\', \''.$question->is_active.'\')" class="btn btn-xs btn-default">확인' ?>
    +
    +
    +
    +
    +
    +
    + + + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/resources/index.html b/2_services/1_metaverse/nodam/application/views/admin/resources/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/resources/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/resources/index.php b/2_services/1_metaverse/nodam/application/views/admin/resources/index.php new file mode 100644 index 0000000000000000000000000000000000000000..5ad5d076b03d8e60ed78a5b218655a631702fa20 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/resources/index.php @@ -0,0 +1,28 @@ + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    Default Box Example

    +
    +
    + + + +
    +
    +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/survey_results/index.html b/2_services/1_metaverse/nodam/application/views/admin/survey_results/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/survey_results/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/survey_results/index.php b/2_services/1_metaverse/nodam/application/views/admin/survey_results/index.php new file mode 100644 index 0000000000000000000000000000000000000000..6946929c30b249a0d3396b271223db135479453b --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/survey_results/index.php @@ -0,0 +1,133 @@ + +
    +
    + + +
    +
    + +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + + + +
    인덱스아이디이름총점상세
    index ?>id ?>name ?>amount ?>index.'\',\''.$survey->id.'\',\''.$survey->name.'\',\''.$survey->amount.'\')" class="btn btn-xs btn-default">확인' ?>
    +
    +
    +
    +
    +
    +
    + + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/surveys/index.html b/2_services/1_metaverse/nodam/application/views/admin/surveys/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/surveys/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/surveys/index.php b/2_services/1_metaverse/nodam/application/views/admin/surveys/index.php new file mode 100644 index 0000000000000000000000000000000000000000..530e4d825e852acc8f61c2d55c3d140ddef11cd2 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/surveys/index.php @@ -0,0 +1,272 @@ + +
    +
    + + +
    +
    +
    +
    + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + + + + + + + +
    인덱스설문상태상세
    index ?>question ?>is_active == 1 ? '' : '' ?>uid.'\', \''.$question->question.'\', \''.$question->is_active.'\')" class="btn btn-xs btn-default">확인' ?>
    +
    +
    +
    +
    +
    +
    + + + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/users/create.php b/2_services/1_metaverse/nodam/application/views/admin/users/create.php new file mode 100644 index 0000000000000000000000000000000000000000..c12adf9407065e4a796943d5a51c5678c51b8481 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/users/create.php @@ -0,0 +1,83 @@ + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    +
    +
    + + + 'form-horizontal', 'id' => 'form-create_user')); ?> +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    +
    +
    + 'submit', 'class' => 'btn btn-primary btn-flat', 'content' => lang('actions_submit'))); ?> + 'reset', 'class' => 'btn btn-warning btn-flat', 'content' => lang('actions_reset'))); ?> + 'btn btn-default btn-flat')); ?> +
    +
    +
    + +
    +
    +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/users/deactivate.php b/2_services/1_metaverse/nodam/application/views/admin/users/deactivate.php new file mode 100644 index 0000000000000000000000000000000000000000..f47a302a22b8be26a5a9a83b78241460f90ebda7 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/users/deactivate.php @@ -0,0 +1,47 @@ + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    '.$firstname.$lastname).'';?>

    +
    +
    + 'form-horizontal', 'id' => 'form-status_user')); ?> +
    +
    + + +
    +
    +
    +
    + + $id)); ?> +
    + 'submit', 'class' => 'btn btn-primary btn-flat', 'content' => lang('actions_submit'))); ?> + 'btn btn-default btn-flat')); ?> +
    +
    +
    + +
    +
    +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/users/delete.php b/2_services/1_metaverse/nodam/application/views/admin/users/delete.php new file mode 100644 index 0000000000000000000000000000000000000000..e8f0046386170981c13ec807b8b723c394d17c2f --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/users/delete.php @@ -0,0 +1,5 @@ + + +

    Users - Delete

    diff --git a/2_services/1_metaverse/nodam/application/views/admin/users/edit.php b/2_services/1_metaverse/nodam/application/views/admin/users/edit.php new file mode 100644 index 0000000000000000000000000000000000000000..94171af17df3d7c5b0841b04b12826e80e0ab8b7 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/users/edit.php @@ -0,0 +1,107 @@ + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    +
    +
    + + + 'form-horizontal', 'id' => 'form-edit_user')); ?> +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    +
    +
    +
    +
    + 'col-sm-2 control-label')); ?> +
    + +
    +
    + +ion_auth->is_admin()): ?> +
    + +
    + +id) { + $checked = ' checked="checked"'; + break; + } + } +?> +
    + +
    + +
    +
    + +
    +
    + id);?> + +
    + 'submit', 'class' => 'btn btn-primary btn-flat', 'content' => lang('actions_submit'))); ?> + 'reset', 'class' => 'btn btn-warning btn-flat', 'content' => lang('actions_reset'))); ?> + 'btn btn-default btn-flat')); ?> +
    +
    +
    + +
    +
    +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/admin/users/index.html b/2_services/1_metaverse/nodam/application/views/admin/users/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/users/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/users/index.php b/2_services/1_metaverse/nodam/application/views/admin/users/index.php new file mode 100644 index 0000000000000000000000000000000000000000..0f6528a67afbd4737c6a2d75b65affddb1d5faf2 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/users/index.php @@ -0,0 +1,257 @@ + +
    +
    + + +
    +
    +
    +
    +
    +
    + + + + + + + + + + + + + index != 1){ ?> + + + + + + + + + + +
    인덱스아이디이름상태상세
    index ?>id ?>name ?>is_active == 1 ? '' : ''); +?>uid.'\', \''.$user->id.'\', \''.$user->pw.'\', \''.$user->name.'\', \''.$user->is_active.'\')" class="btn btn-xs btn-default">확인' ?>
    +
    +
    +
    +
    +
    +
    + + + + diff --git a/2_services/1_metaverse/nodam/application/views/admin/users/profile.php b/2_services/1_metaverse/nodam/application/views/admin/users/profile.php new file mode 100644 index 0000000000000000000000000000000000000000..751ab8762df3210a558d9713f3c0f98abaee8679 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/admin/users/profile.php @@ -0,0 +1,93 @@ + + +
    +
    + + +
    + +
    +
    +
    +
    +
    +

    xxxx

    +
    +
    + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
    ip_address; ?>
    first_name, ENT_QUOTES, 'UTF-8'); ?>
    last_name, ENT_QUOTES, 'UTF-8'); ?>
    username, ENT_QUOTES, 'UTF-8'); ?>
    email, ENT_QUOTES, 'UTF-8'); ?>
    created_on); ?>
    last_login)) ? date('d-m-Y', $user->last_login) : NULL; ?>
    active) ? ''.lang('users_active').'' : ''.lang('users_inactive').''; ?>
    company, ENT_QUOTES, 'UTF-8'); ?>
    phone; ?>
    +groups as $group):?> + + bgcolor.'">'.htmlspecialchars($group->name, ENT_QUOTES, 'UTF-8').''; ?> + '.htmlspecialchars($group->name, ENT_QUOTES, 'UTF-8').''; ?> + +
    +
    +
    +
    + +
    +
    +
    +

    xxxx

    +
    +
    + + +
    +
    +
    +
    +
    +
    diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/change_password.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/change_password.php new file mode 100644 index 0000000000000000000000000000000000000000..f8ce60b6592a7140ec3dd15f11dcc3e1f3e83e8f --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/change_password.php @@ -0,0 +1,25 @@ +

    + +
    + + + +

    +
    + +

    + +

    +
    + +

    + +

    +
    + +

    + + +

    + + diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/create_group.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/create_group.php new file mode 100644 index 0000000000000000000000000000000000000000..86b07e93a2d79f3fff27f30edd19574fb172edfb --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/create_group.php @@ -0,0 +1,20 @@ +

    +

    + +
    + + + +

    +
    + +

    + +

    +
    + +

    + +

    + + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/create_user.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/create_user.php new file mode 100644 index 0000000000000000000000000000000000000000..2e043f2ae866c6c805b8294aef515e2169d53d54 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/create_user.php @@ -0,0 +1,46 @@ +

    +

    + +
    + + + +

    +
    + +

    + +

    +
    + +

    + +

    +
    + +

    + +

    +
    + +

    + +

    +
    + +

    + +

    +
    + +

    + +

    +
    + +

    + + +

    + + diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/deactivate_user.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/deactivate_user.php new file mode 100644 index 0000000000000000000000000000000000000000..85e9c36dc591811c5ba7985d1d39be7f8188ce3a --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/deactivate_user.php @@ -0,0 +1,18 @@ +

    +

    username);?>

    + +id);?> + +

    + + + + +

    + + + $user->id)); ?> + +

    + + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/edit_group.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/edit_group.php new file mode 100644 index 0000000000000000000000000000000000000000..080dad7a04a334878504afa8498dce24d0ad8fd2 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/edit_group.php @@ -0,0 +1,20 @@ +

    +

    + +
    + + + +

    +
    + +

    + +

    +
    + +

    + +

    + + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/edit_user.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/edit_user.php new file mode 100644 index 0000000000000000000000000000000000000000..46e4190f4309186caa6e04270a8a32d1bce8b30d --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/edit_user.php @@ -0,0 +1,66 @@ +

    +

    + +
    + + + +

    +
    + +

    + +

    +
    + +

    + +

    +
    + +

    + +

    +
    + +

    + +

    +
    + +

    + +

    +
    + +

    + + ion_auth->is_admin()): ?> + +

    + + + + + + + id);?> + + +

    + + diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/email/activate.tpl.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/email/activate.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..e2436cf712ff8a2e4d6489f7ba4dff70cb524589 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/email/activate.tpl.php @@ -0,0 +1,6 @@ + + +

    +

    + + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/email/forgot_password.tpl.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/email/forgot_password.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..2cc5b02fb08b48a43597fed97e8f4e9d9c90d2de --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/email/forgot_password.tpl.php @@ -0,0 +1,6 @@ + + +

    +

    + + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/email/index.html b/2_services/1_metaverse/nodam/application/views/auth/_Original/email/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/email/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/email/new_password.tpl.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/email/new_password.tpl.php new file mode 100644 index 0000000000000000000000000000000000000000..f2239860fd84cbd25cc467deb4a108cc55fdb364 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/email/new_password.tpl.php @@ -0,0 +1,7 @@ + + +

    + +

    + + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/forgot_password.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/forgot_password.php new file mode 100644 index 0000000000000000000000000000000000000000..e9a42e7fa8ae9e9ebc09c1ba08360f5bf2605d5f --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/forgot_password.php @@ -0,0 +1,15 @@ +

    +

    + +
    + + + +

    +
    + +

    + +

    + + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/index.html b/2_services/1_metaverse/nodam/application/views/auth/_Original/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/index.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/index.php new file mode 100644 index 0000000000000000000000000000000000000000..d95764477ed409ca493aa4809734cbf78829f333 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/index.php @@ -0,0 +1,31 @@ +

    +

    + +
    + + + + + + + + + + + + + + + + + + + + +
    first_name,ENT_QUOTES,'UTF-8');?>last_name,ENT_QUOTES,'UTF-8');?>email,ENT_QUOTES,'UTF-8');?> + groups as $group):?> + id, htmlspecialchars($group->name,ENT_QUOTES,'UTF-8')) ;?>
    + +
    active) ? anchor("auth/deactivate/".$user->id, lang('index_active_link')) : anchor("auth/activate/". $user->id, lang('index_inactive_link'));?>id, 'Edit') ;?>
    + +

    |

    \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/login.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/login.php new file mode 100644 index 0000000000000000000000000000000000000000..58ff16d6ee7c3d6ffefde89c19293c8b4547bc88 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/login.php @@ -0,0 +1,28 @@ +

    +

    + +
    + + + +

    + + +

    + +

    + + +

    + +

    + + +

    + + +

    + + + +

    \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/views/auth/_Original/reset_password.php b/2_services/1_metaverse/nodam/application/views/auth/_Original/reset_password.php new file mode 100644 index 0000000000000000000000000000000000000000..710170484dc19cc4095a70999f7e7d71d8f44872 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_Original/reset_password.php @@ -0,0 +1,22 @@ +

    + +
    + + + +

    +
    + +

    + +

    +
    + +

    + + + + +

    + + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/views/auth/_templates/footer.php b/2_services/1_metaverse/nodam/application/views/auth/_templates/footer.php new file mode 100644 index 0000000000000000000000000000000000000000..0860782af4710cbb0ff876c6f108782ce74123b8 --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_templates/footer.php @@ -0,0 +1,20 @@ + +
    + + + + + + + \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/application/views/auth/_templates/header.php b/2_services/1_metaverse/nodam/application/views/auth/_templates/header.php new file mode 100644 index 0000000000000000000000000000000000000000..782b30efa2e1a1289cece0fe211d529d2888d61e --- /dev/null +++ b/2_services/1_metaverse/nodam/application/views/auth/_templates/header.php @@ -0,0 +1,32 @@ + + + + + + <?php echo $title; ?> + + + + + + + + + + + + + + + + + + ',trigger:"hover focus",title:"",delay:0,html:!1,container:!1,viewport:{selector:"body",padding:0}},c.prototype.init=function(b,c,d){if(this.enabled=!0,this.type=b,this.$element=a(c),this.options=this.getOptions(d),this.$viewport=this.options.viewport&&a(a.isFunction(this.options.viewport)?this.options.viewport.call(this,this.$element):this.options.viewport.selector||this.options.viewport),this.inState={click:!1,hover:!1,focus:!1},this.$element[0]instanceof document.constructor&&!this.options.selector)throw new Error("`selector` option must be specified when initializing "+this.type+" on the window.document object!");for(var e=this.options.trigger.split(" "),f=e.length;f--;){var g=e[f];if("click"==g)this.$element.on("click."+this.type,this.options.selector,a.proxy(this.toggle,this));else if("manual"!=g){var h="hover"==g?"mouseenter":"focusin",i="hover"==g?"mouseleave":"focusout";this.$element.on(h+"."+this.type,this.options.selector,a.proxy(this.enter,this)),this.$element.on(i+"."+this.type,this.options.selector,a.proxy(this.leave,this))}}this.options.selector?this._options=a.extend({},this.options,{trigger:"manual",selector:""}):this.fixTitle()},c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.getOptions=function(b){return b=a.extend({},this.getDefaults(),this.$element.data(),b),b.delay&&"number"==typeof b.delay&&(b.delay={show:b.delay,hide:b.delay}),b},c.prototype.getDelegateOptions=function(){var b={},c=this.getDefaults();return this._options&&a.each(this._options,function(a,d){c[a]!=d&&(b[a]=d)}),b},c.prototype.enter=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);return c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusin"==b.type?"focus":"hover"]=!0),c.tip().hasClass("in")||"in"==c.hoverState?void(c.hoverState="in"):(clearTimeout(c.timeout),c.hoverState="in",c.options.delay&&c.options.delay.show?void(c.timeout=setTimeout(function(){"in"==c.hoverState&&c.show()},c.options.delay.show)):c.show())},c.prototype.isInStateTrue=function(){for(var a in this.inState)if(this.inState[a])return!0;return!1},c.prototype.leave=function(b){var c=b instanceof this.constructor?b:a(b.currentTarget).data("bs."+this.type);if(c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c)),b instanceof a.Event&&(c.inState["focusout"==b.type?"focus":"hover"]=!1),!c.isInStateTrue())return clearTimeout(c.timeout),c.hoverState="out",c.options.delay&&c.options.delay.hide?void(c.timeout=setTimeout(function(){"out"==c.hoverState&&c.hide()},c.options.delay.hide)):c.hide()},c.prototype.show=function(){var b=a.Event("show.bs."+this.type);if(this.hasContent()&&this.enabled){this.$element.trigger(b);var d=a.contains(this.$element[0].ownerDocument.documentElement,this.$element[0]);if(b.isDefaultPrevented()||!d)return;var e=this,f=this.tip(),g=this.getUID(this.type);this.setContent(),f.attr("id",g),this.$element.attr("aria-describedby",g),this.options.animation&&f.addClass("fade");var h="function"==typeof this.options.placement?this.options.placement.call(this,f[0],this.$element[0]):this.options.placement,i=/\s?auto?\s?/i,j=i.test(h);j&&(h=h.replace(i,"")||"top"),f.detach().css({top:0,left:0,display:"block"}).addClass(h).data("bs."+this.type,this),this.options.container?f.appendTo(this.options.container):f.insertAfter(this.$element),this.$element.trigger("inserted.bs."+this.type);var k=this.getPosition(),l=f[0].offsetWidth,m=f[0].offsetHeight;if(j){var n=h,o=this.getPosition(this.$viewport);h="bottom"==h&&k.bottom+m>o.bottom?"top":"top"==h&&k.top-mo.width?"left":"left"==h&&k.left-lg.top+g.height&&(e.top=g.top+g.height-i)}else{var j=b.left-f,k=b.left+f+c;jg.right&&(e.left=g.left+g.width-k)}return e},c.prototype.getTitle=function(){var a,b=this.$element,c=this.options;return a=b.attr("data-original-title")||("function"==typeof c.title?c.title.call(b[0]):c.title)},c.prototype.getUID=function(a){do a+=~~(1e6*Math.random());while(document.getElementById(a));return a},c.prototype.tip=function(){if(!this.$tip&&(this.$tip=a(this.options.template),1!=this.$tip.length))throw new Error(this.type+" `template` option must consist of exactly 1 top-level element!");return this.$tip},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".tooltip-arrow")},c.prototype.enable=function(){this.enabled=!0},c.prototype.disable=function(){this.enabled=!1},c.prototype.toggleEnabled=function(){this.enabled=!this.enabled},c.prototype.toggle=function(b){var c=this;b&&(c=a(b.currentTarget).data("bs."+this.type),c||(c=new this.constructor(b.currentTarget,this.getDelegateOptions()),a(b.currentTarget).data("bs."+this.type,c))),b?(c.inState.click=!c.inState.click,c.isInStateTrue()?c.enter(c):c.leave(c)):c.tip().hasClass("in")?c.leave(c):c.enter(c)},c.prototype.destroy=function(){var a=this;clearTimeout(this.timeout),this.hide(function(){a.$element.off("."+a.type).removeData("bs."+a.type),a.$tip&&a.$tip.detach(),a.$tip=null,a.$arrow=null,a.$viewport=null,a.$element=null})};var d=a.fn.tooltip;a.fn.tooltip=b,a.fn.tooltip.Constructor=c,a.fn.tooltip.noConflict=function(){return a.fn.tooltip=d,this}}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.popover"),f="object"==typeof b&&b;!e&&/destroy|hide/.test(b)||(e||d.data("bs.popover",e=new c(this,f)),"string"==typeof b&&e[b]())})}var c=function(a,b){this.init("popover",a,b)};if(!a.fn.tooltip)throw new Error("Popover requires tooltip.js");c.VERSION="3.3.7",c.DEFAULTS=a.extend({},a.fn.tooltip.Constructor.DEFAULTS,{placement:"right",trigger:"click",content:"",template:''}),c.prototype=a.extend({},a.fn.tooltip.Constructor.prototype),c.prototype.constructor=c,c.prototype.getDefaults=function(){return c.DEFAULTS},c.prototype.setContent=function(){var a=this.tip(),b=this.getTitle(),c=this.getContent();a.find(".popover-title")[this.options.html?"html":"text"](b),a.find(".popover-content").children().detach().end()[this.options.html?"string"==typeof c?"html":"append":"text"](c),a.removeClass("fade top bottom left right in"),a.find(".popover-title").html()||a.find(".popover-title").hide()},c.prototype.hasContent=function(){return this.getTitle()||this.getContent()},c.prototype.getContent=function(){var a=this.$element,b=this.options;return a.attr("data-content")||("function"==typeof b.content?b.content.call(a[0]):b.content)},c.prototype.arrow=function(){return this.$arrow=this.$arrow||this.tip().find(".arrow")};var d=a.fn.popover;a.fn.popover=b,a.fn.popover.Constructor=c,a.fn.popover.noConflict=function(){return a.fn.popover=d,this}}(jQuery),+function(a){"use strict";function b(c,d){this.$body=a(document.body),this.$scrollElement=a(a(c).is(document.body)?window:c),this.options=a.extend({},b.DEFAULTS,d),this.selector=(this.options.target||"")+" .nav li > a",this.offsets=[],this.targets=[],this.activeTarget=null,this.scrollHeight=0,this.$scrollElement.on("scroll.bs.scrollspy",a.proxy(this.process,this)),this.refresh(),this.process()}function c(c){return this.each(function(){var d=a(this),e=d.data("bs.scrollspy"),f="object"==typeof c&&c;e||d.data("bs.scrollspy",e=new b(this,f)),"string"==typeof c&&e[c]()})}b.VERSION="3.3.7",b.DEFAULTS={offset:10},b.prototype.getScrollHeight=function(){return this.$scrollElement[0].scrollHeight||Math.max(this.$body[0].scrollHeight,document.documentElement.scrollHeight)},b.prototype.refresh=function(){var b=this,c="offset",d=0;this.offsets=[],this.targets=[],this.scrollHeight=this.getScrollHeight(),a.isWindow(this.$scrollElement[0])||(c="position",d=this.$scrollElement.scrollTop()),this.$body.find(this.selector).map(function(){var b=a(this),e=b.data("target")||b.attr("href"),f=/^#./.test(e)&&a(e);return f&&f.length&&f.is(":visible")&&[[f[c]().top+d,e]]||null}).sort(function(a,b){return a[0]-b[0]}).each(function(){b.offsets.push(this[0]),b.targets.push(this[1])})},b.prototype.process=function(){var a,b=this.$scrollElement.scrollTop()+this.options.offset,c=this.getScrollHeight(),d=this.options.offset+c-this.$scrollElement.height(),e=this.offsets,f=this.targets,g=this.activeTarget;if(this.scrollHeight!=c&&this.refresh(),b>=d)return g!=(a=f[f.length-1])&&this.activate(a);if(g&&b=e[a]&&(void 0===e[a+1]||b .dropdown-menu > .active").removeClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!1),b.addClass("active").find('[data-toggle="tab"]').attr("aria-expanded",!0),h?(b[0].offsetWidth,b.addClass("in")):b.removeClass("fade"),b.parent(".dropdown-menu").length&&b.closest("li.dropdown").addClass("active").end().find('[data-toggle="tab"]').attr("aria-expanded",!0),e&&e()}var g=d.find("> .active"),h=e&&a.support.transition&&(g.length&&g.hasClass("fade")||!!d.find("> .fade").length);g.length&&h?g.one("bsTransitionEnd",f).emulateTransitionEnd(c.TRANSITION_DURATION):f(),g.removeClass("in")};var d=a.fn.tab;a.fn.tab=b,a.fn.tab.Constructor=c,a.fn.tab.noConflict=function(){return a.fn.tab=d,this};var e=function(c){c.preventDefault(),b.call(a(this),"show")};a(document).on("click.bs.tab.data-api",'[data-toggle="tab"]',e).on("click.bs.tab.data-api",'[data-toggle="pill"]',e)}(jQuery),+function(a){"use strict";function b(b){return this.each(function(){var d=a(this),e=d.data("bs.affix"),f="object"==typeof b&&b;e||d.data("bs.affix",e=new c(this,f)),"string"==typeof b&&e[b]()})}var c=function(b,d){this.options=a.extend({},c.DEFAULTS,d),this.$target=a(this.options.target).on("scroll.bs.affix.data-api",a.proxy(this.checkPosition,this)).on("click.bs.affix.data-api",a.proxy(this.checkPositionWithEventLoop,this)),this.$element=a(b),this.affixed=null,this.unpin=null,this.pinnedOffset=null,this.checkPosition()};c.VERSION="3.3.7",c.RESET="affix affix-top affix-bottom",c.DEFAULTS={offset:0,target:window},c.prototype.getState=function(a,b,c,d){var e=this.$target.scrollTop(),f=this.$element.offset(),g=this.$target.height();if(null!=c&&"top"==this.affixed)return e=a-d&&"bottom"},c.prototype.getPinnedOffset=function(){if(this.pinnedOffset)return this.pinnedOffset;this.$element.removeClass(c.RESET).addClass("affix");var a=this.$target.scrollTop(),b=this.$element.offset();return this.pinnedOffset=b.top-a},c.prototype.checkPositionWithEventLoop=function(){setTimeout(a.proxy(this.checkPosition,this),1)},c.prototype.checkPosition=function(){if(this.$element.is(":visible")){var b=this.$element.height(),d=this.options.offset,e=d.top,f=d.bottom,g=Math.max(a(document).height(),a(document.body).height());"object"!=typeof d&&(f=e=d),"function"==typeof e&&(e=d.top(this.$element)),"function"==typeof f&&(f=d.bottom(this.$element));var h=this.getState(g,b,e,f);if(this.affixed!=h){null!=this.unpin&&this.$element.css("top","");var i="affix"+(h?"-"+h:""),j=a.Event(i+".bs.affix");if(this.$element.trigger(j),j.isDefaultPrevented())return;this.affixed=h,this.unpin="bottom"==h?this.getPinnedOffset():null,this.$element.removeClass(c.RESET).addClass(i).trigger(i.replace("affix","affixed")+".bs.affix")}"bottom"==h&&this.$element.offset({top:g-b-f})}};var d=a.fn.affix;a.fn.affix=b,a.fn.affix.Constructor=c,a.fn.affix.noConflict=function(){return a.fn.affix=d,this},a(window).on("load",function(){a('[data-spy="affix"]').each(function(){var c=a(this),d=c.data();d.offset=d.offset||{},null!=d.offsetBottom&&(d.offset.bottom=d.offsetBottom),null!=d.offsetTop&&(d.offset.top=d.offsetTop),b.call(c,d)})})}(jQuery); \ No newline at end of file diff --git a/2_services/1_metaverse/nodam/assets/frameworks/bootstrap/js/index.html b/2_services/1_metaverse/nodam/assets/frameworks/bootstrap/js/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/bootstrap/js/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/domprojects/css/dp.min.css b/2_services/1_metaverse/nodam/assets/frameworks/domprojects/css/dp.min.css new file mode 100644 index 0000000000000000000000000000000000000000..139597f9cb07c5d48bed18984ec4747f4b4f3438 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/domprojects/css/dp.min.css @@ -0,0 +1,2 @@ + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/domprojects/css/index.html b/2_services/1_metaverse/nodam/assets/frameworks/domprojects/css/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/domprojects/css/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/domprojects/index.html b/2_services/1_metaverse/nodam/assets/frameworks/domprojects/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/domprojects/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/domprojects/js/dp.min.js b/2_services/1_metaverse/nodam/assets/frameworks/domprojects/js/dp.min.js new file mode 100644 index 0000000000000000000000000000000000000000..4584de38aa9f07e1b5bf1df993f6b5c0e50a7222 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/domprojects/js/dp.min.js @@ -0,0 +1,64 @@ +$(document).ready(function(){ + /* + if ($('.animsition').length) { + $('.animsition').animsition({ + inClass : 'fade-in', + outClass : 'fade-out', + inDuration : 400, + outDuration : 200, + linkElement : 'a[href]:not([target="_blank"]):not([href^="mailto\\:"]):not([href^="\\#"])', + loading : true, + loadingParentElement: 'body', + loadingClass : 'animsition-loading', + unSupportCss : ['animation-duration', '-webkit-animation-duration', '-o-animation-duration'], + overlay : false, + overlayClass : 'animsition-overlay-slide', + overlayParentElement: 'body' + }); + } + */ + + if ($('#password').length) { + var options = {}; + + options.ui = { + container: '#pwd-container', + showVerdictsInsideProgressBar: true, + viewports: { + progress: '.pwstrength_viewport_progress' + } + }; + options.common = { + debug: false, + onLoad: function() { + $('#messages').text('Start typing password'); + } + }; + + $('#password').pwstrength(options); + } + + if ($('#group_bgcolor').length) { + var elem = $('#group_bgcolor'); + + elem.ColorPickerSliders({ + size: 'lg', + placement: 'auto bottom', + previewformat: 'hex', + color: elem.attr('data-src'), + swatches: ['#F44336', '#E91E63', '#9C27B0', '#673AB7', '#3F51B5', '#2196F3', '#009688', '#FF5722', '#795548', '#607D8B', '#000000'], + customswatches: false, + order: {} + }); + + $('button[type="reset"]').on('click', function(e){ + elem.trigger('colorpickersliders.updateColor', elem.attr('data-src')); + }); + } +}); + + +$(window).load(function(){ + + +}); diff --git a/2_services/1_metaverse/nodam/assets/frameworks/domprojects/js/index.html b/2_services/1_metaverse/nodam/assets/frameworks/domprojects/js/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/domprojects/js/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/css/font-awesome.min.css b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/css/font-awesome.min.css new file mode 100644 index 0000000000000000000000000000000000000000..540440ce89f2a408aa699b65100e18f15e0f09ca --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/css/font-awesome.min.css @@ -0,0 +1,4 @@ +/*! + * Font Awesome 4.7.0 by @davegandy - http://fontawesome.io - @fontawesome + * License - http://fontawesome.io/license (Font: SIL OFL 1.1, CSS: MIT License) + */@font-face{font-family:'FontAwesome';src:url('../fonts/fontawesome-webfont.eot?v=4.7.0');src:url('../fonts/fontawesome-webfont.eot?#iefix&v=4.7.0') format('embedded-opentype'),url('../fonts/fontawesome-webfont.woff2?v=4.7.0') format('woff2'),url('../fonts/fontawesome-webfont.woff?v=4.7.0') format('woff'),url('../fonts/fontawesome-webfont.ttf?v=4.7.0') format('truetype'),url('../fonts/fontawesome-webfont.svg?v=4.7.0#fontawesomeregular') format('svg');font-weight:normal;font-style:normal}.fa{display:inline-block;font:normal normal normal 14px/1 FontAwesome;font-size:inherit;text-rendering:auto;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.fa-lg{font-size:1.33333333em;line-height:.75em;vertical-align:-15%}.fa-2x{font-size:2em}.fa-3x{font-size:3em}.fa-4x{font-size:4em}.fa-5x{font-size:5em}.fa-fw{width:1.28571429em;text-align:center}.fa-ul{padding-left:0;margin-left:2.14285714em;list-style-type:none}.fa-ul>li{position:relative}.fa-li{position:absolute;left:-2.14285714em;width:2.14285714em;top:.14285714em;text-align:center}.fa-li.fa-lg{left:-1.85714286em}.fa-border{padding:.2em .25em .15em;border:solid .08em #eee;border-radius:.1em}.fa-pull-left{float:left}.fa-pull-right{float:right}.fa.fa-pull-left{margin-right:.3em}.fa.fa-pull-right{margin-left:.3em}.pull-right{float:right}.pull-left{float:left}.fa.pull-left{margin-right:.3em}.fa.pull-right{margin-left:.3em}.fa-spin{-webkit-animation:fa-spin 2s infinite linear;animation:fa-spin 2s infinite linear}.fa-pulse{-webkit-animation:fa-spin 1s infinite steps(8);animation:fa-spin 1s infinite steps(8)}@-webkit-keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}@keyframes fa-spin{0%{-webkit-transform:rotate(0deg);transform:rotate(0deg)}100%{-webkit-transform:rotate(359deg);transform:rotate(359deg)}}.fa-rotate-90{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=1)";-webkit-transform:rotate(90deg);-ms-transform:rotate(90deg);transform:rotate(90deg)}.fa-rotate-180{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2)";-webkit-transform:rotate(180deg);-ms-transform:rotate(180deg);transform:rotate(180deg)}.fa-rotate-270{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=3)";-webkit-transform:rotate(270deg);-ms-transform:rotate(270deg);transform:rotate(270deg)}.fa-flip-horizontal{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=0, mirror=1)";-webkit-transform:scale(-1, 1);-ms-transform:scale(-1, 1);transform:scale(-1, 1)}.fa-flip-vertical{-ms-filter:"progid:DXImageTransform.Microsoft.BasicImage(rotation=2, mirror=1)";-webkit-transform:scale(1, -1);-ms-transform:scale(1, -1);transform:scale(1, -1)}:root .fa-rotate-90,:root .fa-rotate-180,:root .fa-rotate-270,:root .fa-flip-horizontal,:root .fa-flip-vertical{filter:none}.fa-stack{position:relative;display:inline-block;width:2em;height:2em;line-height:2em;vertical-align:middle}.fa-stack-1x,.fa-stack-2x{position:absolute;left:0;width:100%;text-align:center}.fa-stack-1x{line-height:inherit}.fa-stack-2x{font-size:2em}.fa-inverse{color:#fff}.fa-glass:before{content:"\f000"}.fa-music:before{content:"\f001"}.fa-search:before{content:"\f002"}.fa-envelope-o:before{content:"\f003"}.fa-heart:before{content:"\f004"}.fa-star:before{content:"\f005"}.fa-star-o:before{content:"\f006"}.fa-user:before{content:"\f007"}.fa-film:before{content:"\f008"}.fa-th-large:before{content:"\f009"}.fa-th:before{content:"\f00a"}.fa-th-list:before{content:"\f00b"}.fa-check:before{content:"\f00c"}.fa-remove:before,.fa-close:before,.fa-times:before{content:"\f00d"}.fa-search-plus:before{content:"\f00e"}.fa-search-minus:before{content:"\f010"}.fa-power-off:before{content:"\f011"}.fa-signal:before{content:"\f012"}.fa-gear:before,.fa-cog:before{content:"\f013"}.fa-trash-o:before{content:"\f014"}.fa-home:before{content:"\f015"}.fa-file-o:before{content:"\f016"}.fa-clock-o:before{content:"\f017"}.fa-road:before{content:"\f018"}.fa-download:before{content:"\f019"}.fa-arrow-circle-o-down:before{content:"\f01a"}.fa-arrow-circle-o-up:before{content:"\f01b"}.fa-inbox:before{content:"\f01c"}.fa-play-circle-o:before{content:"\f01d"}.fa-rotate-right:before,.fa-repeat:before{content:"\f01e"}.fa-refresh:before{content:"\f021"}.fa-list-alt:before{content:"\f022"}.fa-lock:before{content:"\f023"}.fa-flag:before{content:"\f024"}.fa-headphones:before{content:"\f025"}.fa-volume-off:before{content:"\f026"}.fa-volume-down:before{content:"\f027"}.fa-volume-up:before{content:"\f028"}.fa-qrcode:before{content:"\f029"}.fa-barcode:before{content:"\f02a"}.fa-tag:before{content:"\f02b"}.fa-tags:before{content:"\f02c"}.fa-book:before{content:"\f02d"}.fa-bookmark:before{content:"\f02e"}.fa-print:before{content:"\f02f"}.fa-camera:before{content:"\f030"}.fa-font:before{content:"\f031"}.fa-bold:before{content:"\f032"}.fa-italic:before{content:"\f033"}.fa-text-height:before{content:"\f034"}.fa-text-width:before{content:"\f035"}.fa-align-left:before{content:"\f036"}.fa-align-center:before{content:"\f037"}.fa-align-right:before{content:"\f038"}.fa-align-justify:before{content:"\f039"}.fa-list:before{content:"\f03a"}.fa-dedent:before,.fa-outdent:before{content:"\f03b"}.fa-indent:before{content:"\f03c"}.fa-video-camera:before{content:"\f03d"}.fa-photo:before,.fa-image:before,.fa-picture-o:before{content:"\f03e"}.fa-pencil:before{content:"\f040"}.fa-map-marker:before{content:"\f041"}.fa-adjust:before{content:"\f042"}.fa-tint:before{content:"\f043"}.fa-edit:before,.fa-pencil-square-o:before{content:"\f044"}.fa-share-square-o:before{content:"\f045"}.fa-check-square-o:before{content:"\f046"}.fa-arrows:before{content:"\f047"}.fa-step-backward:before{content:"\f048"}.fa-fast-backward:before{content:"\f049"}.fa-backward:before{content:"\f04a"}.fa-play:before{content:"\f04b"}.fa-pause:before{content:"\f04c"}.fa-stop:before{content:"\f04d"}.fa-forward:before{content:"\f04e"}.fa-fast-forward:before{content:"\f050"}.fa-step-forward:before{content:"\f051"}.fa-eject:before{content:"\f052"}.fa-chevron-left:before{content:"\f053"}.fa-chevron-right:before{content:"\f054"}.fa-plus-circle:before{content:"\f055"}.fa-minus-circle:before{content:"\f056"}.fa-times-circle:before{content:"\f057"}.fa-check-circle:before{content:"\f058"}.fa-question-circle:before{content:"\f059"}.fa-info-circle:before{content:"\f05a"}.fa-crosshairs:before{content:"\f05b"}.fa-times-circle-o:before{content:"\f05c"}.fa-check-circle-o:before{content:"\f05d"}.fa-ban:before{content:"\f05e"}.fa-arrow-left:before{content:"\f060"}.fa-arrow-right:before{content:"\f061"}.fa-arrow-up:before{content:"\f062"}.fa-arrow-down:before{content:"\f063"}.fa-mail-forward:before,.fa-share:before{content:"\f064"}.fa-expand:before{content:"\f065"}.fa-compress:before{content:"\f066"}.fa-plus:before{content:"\f067"}.fa-minus:before{content:"\f068"}.fa-asterisk:before{content:"\f069"}.fa-exclamation-circle:before{content:"\f06a"}.fa-gift:before{content:"\f06b"}.fa-leaf:before{content:"\f06c"}.fa-fire:before{content:"\f06d"}.fa-eye:before{content:"\f06e"}.fa-eye-slash:before{content:"\f070"}.fa-warning:before,.fa-exclamation-triangle:before{content:"\f071"}.fa-plane:before{content:"\f072"}.fa-calendar:before{content:"\f073"}.fa-random:before{content:"\f074"}.fa-comment:before{content:"\f075"}.fa-magnet:before{content:"\f076"}.fa-chevron-up:before{content:"\f077"}.fa-chevron-down:before{content:"\f078"}.fa-retweet:before{content:"\f079"}.fa-shopping-cart:before{content:"\f07a"}.fa-folder:before{content:"\f07b"}.fa-folder-open:before{content:"\f07c"}.fa-arrows-v:before{content:"\f07d"}.fa-arrows-h:before{content:"\f07e"}.fa-bar-chart-o:before,.fa-bar-chart:before{content:"\f080"}.fa-twitter-square:before{content:"\f081"}.fa-facebook-square:before{content:"\f082"}.fa-camera-retro:before{content:"\f083"}.fa-key:before{content:"\f084"}.fa-gears:before,.fa-cogs:before{content:"\f085"}.fa-comments:before{content:"\f086"}.fa-thumbs-o-up:before{content:"\f087"}.fa-thumbs-o-down:before{content:"\f088"}.fa-star-half:before{content:"\f089"}.fa-heart-o:before{content:"\f08a"}.fa-sign-out:before{content:"\f08b"}.fa-linkedin-square:before{content:"\f08c"}.fa-thumb-tack:before{content:"\f08d"}.fa-external-link:before{content:"\f08e"}.fa-sign-in:before{content:"\f090"}.fa-trophy:before{content:"\f091"}.fa-github-square:before{content:"\f092"}.fa-upload:before{content:"\f093"}.fa-lemon-o:before{content:"\f094"}.fa-phone:before{content:"\f095"}.fa-square-o:before{content:"\f096"}.fa-bookmark-o:before{content:"\f097"}.fa-phone-square:before{content:"\f098"}.fa-twitter:before{content:"\f099"}.fa-facebook-f:before,.fa-facebook:before{content:"\f09a"}.fa-github:before{content:"\f09b"}.fa-unlock:before{content:"\f09c"}.fa-credit-card:before{content:"\f09d"}.fa-feed:before,.fa-rss:before{content:"\f09e"}.fa-hdd-o:before{content:"\f0a0"}.fa-bullhorn:before{content:"\f0a1"}.fa-bell:before{content:"\f0f3"}.fa-certificate:before{content:"\f0a3"}.fa-hand-o-right:before{content:"\f0a4"}.fa-hand-o-left:before{content:"\f0a5"}.fa-hand-o-up:before{content:"\f0a6"}.fa-hand-o-down:before{content:"\f0a7"}.fa-arrow-circle-left:before{content:"\f0a8"}.fa-arrow-circle-right:before{content:"\f0a9"}.fa-arrow-circle-up:before{content:"\f0aa"}.fa-arrow-circle-down:before{content:"\f0ab"}.fa-globe:before{content:"\f0ac"}.fa-wrench:before{content:"\f0ad"}.fa-tasks:before{content:"\f0ae"}.fa-filter:before{content:"\f0b0"}.fa-briefcase:before{content:"\f0b1"}.fa-arrows-alt:before{content:"\f0b2"}.fa-group:before,.fa-users:before{content:"\f0c0"}.fa-chain:before,.fa-link:before{content:"\f0c1"}.fa-cloud:before{content:"\f0c2"}.fa-flask:before{content:"\f0c3"}.fa-cut:before,.fa-scissors:before{content:"\f0c4"}.fa-copy:before,.fa-files-o:before{content:"\f0c5"}.fa-paperclip:before{content:"\f0c6"}.fa-save:before,.fa-floppy-o:before{content:"\f0c7"}.fa-square:before{content:"\f0c8"}.fa-navicon:before,.fa-reorder:before,.fa-bars:before{content:"\f0c9"}.fa-list-ul:before{content:"\f0ca"}.fa-list-ol:before{content:"\f0cb"}.fa-strikethrough:before{content:"\f0cc"}.fa-underline:before{content:"\f0cd"}.fa-table:before{content:"\f0ce"}.fa-magic:before{content:"\f0d0"}.fa-truck:before{content:"\f0d1"}.fa-pinterest:before{content:"\f0d2"}.fa-pinterest-square:before{content:"\f0d3"}.fa-google-plus-square:before{content:"\f0d4"}.fa-google-plus:before{content:"\f0d5"}.fa-money:before{content:"\f0d6"}.fa-caret-down:before{content:"\f0d7"}.fa-caret-up:before{content:"\f0d8"}.fa-caret-left:before{content:"\f0d9"}.fa-caret-right:before{content:"\f0da"}.fa-columns:before{content:"\f0db"}.fa-unsorted:before,.fa-sort:before{content:"\f0dc"}.fa-sort-down:before,.fa-sort-desc:before{content:"\f0dd"}.fa-sort-up:before,.fa-sort-asc:before{content:"\f0de"}.fa-envelope:before{content:"\f0e0"}.fa-linkedin:before{content:"\f0e1"}.fa-rotate-left:before,.fa-undo:before{content:"\f0e2"}.fa-legal:before,.fa-gavel:before{content:"\f0e3"}.fa-dashboard:before,.fa-tachometer:before{content:"\f0e4"}.fa-comment-o:before{content:"\f0e5"}.fa-comments-o:before{content:"\f0e6"}.fa-flash:before,.fa-bolt:before{content:"\f0e7"}.fa-sitemap:before{content:"\f0e8"}.fa-umbrella:before{content:"\f0e9"}.fa-paste:before,.fa-clipboard:before{content:"\f0ea"}.fa-lightbulb-o:before{content:"\f0eb"}.fa-exchange:before{content:"\f0ec"}.fa-cloud-download:before{content:"\f0ed"}.fa-cloud-upload:before{content:"\f0ee"}.fa-user-md:before{content:"\f0f0"}.fa-stethoscope:before{content:"\f0f1"}.fa-suitcase:before{content:"\f0f2"}.fa-bell-o:before{content:"\f0a2"}.fa-coffee:before{content:"\f0f4"}.fa-cutlery:before{content:"\f0f5"}.fa-file-text-o:before{content:"\f0f6"}.fa-building-o:before{content:"\f0f7"}.fa-hospital-o:before{content:"\f0f8"}.fa-ambulance:before{content:"\f0f9"}.fa-medkit:before{content:"\f0fa"}.fa-fighter-jet:before{content:"\f0fb"}.fa-beer:before{content:"\f0fc"}.fa-h-square:before{content:"\f0fd"}.fa-plus-square:before{content:"\f0fe"}.fa-angle-double-left:before{content:"\f100"}.fa-angle-double-right:before{content:"\f101"}.fa-angle-double-up:before{content:"\f102"}.fa-angle-double-down:before{content:"\f103"}.fa-angle-left:before{content:"\f104"}.fa-angle-right:before{content:"\f105"}.fa-angle-up:before{content:"\f106"}.fa-angle-down:before{content:"\f107"}.fa-desktop:before{content:"\f108"}.fa-laptop:before{content:"\f109"}.fa-tablet:before{content:"\f10a"}.fa-mobile-phone:before,.fa-mobile:before{content:"\f10b"}.fa-circle-o:before{content:"\f10c"}.fa-quote-left:before{content:"\f10d"}.fa-quote-right:before{content:"\f10e"}.fa-spinner:before{content:"\f110"}.fa-circle:before{content:"\f111"}.fa-mail-reply:before,.fa-reply:before{content:"\f112"}.fa-github-alt:before{content:"\f113"}.fa-folder-o:before{content:"\f114"}.fa-folder-open-o:before{content:"\f115"}.fa-smile-o:before{content:"\f118"}.fa-frown-o:before{content:"\f119"}.fa-meh-o:before{content:"\f11a"}.fa-gamepad:before{content:"\f11b"}.fa-keyboard-o:before{content:"\f11c"}.fa-flag-o:before{content:"\f11d"}.fa-flag-checkered:before{content:"\f11e"}.fa-terminal:before{content:"\f120"}.fa-code:before{content:"\f121"}.fa-mail-reply-all:before,.fa-reply-all:before{content:"\f122"}.fa-star-half-empty:before,.fa-star-half-full:before,.fa-star-half-o:before{content:"\f123"}.fa-location-arrow:before{content:"\f124"}.fa-crop:before{content:"\f125"}.fa-code-fork:before{content:"\f126"}.fa-unlink:before,.fa-chain-broken:before{content:"\f127"}.fa-question:before{content:"\f128"}.fa-info:before{content:"\f129"}.fa-exclamation:before{content:"\f12a"}.fa-superscript:before{content:"\f12b"}.fa-subscript:before{content:"\f12c"}.fa-eraser:before{content:"\f12d"}.fa-puzzle-piece:before{content:"\f12e"}.fa-microphone:before{content:"\f130"}.fa-microphone-slash:before{content:"\f131"}.fa-shield:before{content:"\f132"}.fa-calendar-o:before{content:"\f133"}.fa-fire-extinguisher:before{content:"\f134"}.fa-rocket:before{content:"\f135"}.fa-maxcdn:before{content:"\f136"}.fa-chevron-circle-left:before{content:"\f137"}.fa-chevron-circle-right:before{content:"\f138"}.fa-chevron-circle-up:before{content:"\f139"}.fa-chevron-circle-down:before{content:"\f13a"}.fa-html5:before{content:"\f13b"}.fa-css3:before{content:"\f13c"}.fa-anchor:before{content:"\f13d"}.fa-unlock-alt:before{content:"\f13e"}.fa-bullseye:before{content:"\f140"}.fa-ellipsis-h:before{content:"\f141"}.fa-ellipsis-v:before{content:"\f142"}.fa-rss-square:before{content:"\f143"}.fa-play-circle:before{content:"\f144"}.fa-ticket:before{content:"\f145"}.fa-minus-square:before{content:"\f146"}.fa-minus-square-o:before{content:"\f147"}.fa-level-up:before{content:"\f148"}.fa-level-down:before{content:"\f149"}.fa-check-square:before{content:"\f14a"}.fa-pencil-square:before{content:"\f14b"}.fa-external-link-square:before{content:"\f14c"}.fa-share-square:before{content:"\f14d"}.fa-compass:before{content:"\f14e"}.fa-toggle-down:before,.fa-caret-square-o-down:before{content:"\f150"}.fa-toggle-up:before,.fa-caret-square-o-up:before{content:"\f151"}.fa-toggle-right:before,.fa-caret-square-o-right:before{content:"\f152"}.fa-euro:before,.fa-eur:before{content:"\f153"}.fa-gbp:before{content:"\f154"}.fa-dollar:before,.fa-usd:before{content:"\f155"}.fa-rupee:before,.fa-inr:before{content:"\f156"}.fa-cny:before,.fa-rmb:before,.fa-yen:before,.fa-jpy:before{content:"\f157"}.fa-ruble:before,.fa-rouble:before,.fa-rub:before{content:"\f158"}.fa-won:before,.fa-krw:before{content:"\f159"}.fa-bitcoin:before,.fa-btc:before{content:"\f15a"}.fa-file:before{content:"\f15b"}.fa-file-text:before{content:"\f15c"}.fa-sort-alpha-asc:before{content:"\f15d"}.fa-sort-alpha-desc:before{content:"\f15e"}.fa-sort-amount-asc:before{content:"\f160"}.fa-sort-amount-desc:before{content:"\f161"}.fa-sort-numeric-asc:before{content:"\f162"}.fa-sort-numeric-desc:before{content:"\f163"}.fa-thumbs-up:before{content:"\f164"}.fa-thumbs-down:before{content:"\f165"}.fa-youtube-square:before{content:"\f166"}.fa-youtube:before{content:"\f167"}.fa-xing:before{content:"\f168"}.fa-xing-square:before{content:"\f169"}.fa-youtube-play:before{content:"\f16a"}.fa-dropbox:before{content:"\f16b"}.fa-stack-overflow:before{content:"\f16c"}.fa-instagram:before{content:"\f16d"}.fa-flickr:before{content:"\f16e"}.fa-adn:before{content:"\f170"}.fa-bitbucket:before{content:"\f171"}.fa-bitbucket-square:before{content:"\f172"}.fa-tumblr:before{content:"\f173"}.fa-tumblr-square:before{content:"\f174"}.fa-long-arrow-down:before{content:"\f175"}.fa-long-arrow-up:before{content:"\f176"}.fa-long-arrow-left:before{content:"\f177"}.fa-long-arrow-right:before{content:"\f178"}.fa-apple:before{content:"\f179"}.fa-windows:before{content:"\f17a"}.fa-android:before{content:"\f17b"}.fa-linux:before{content:"\f17c"}.fa-dribbble:before{content:"\f17d"}.fa-skype:before{content:"\f17e"}.fa-foursquare:before{content:"\f180"}.fa-trello:before{content:"\f181"}.fa-female:before{content:"\f182"}.fa-male:before{content:"\f183"}.fa-gittip:before,.fa-gratipay:before{content:"\f184"}.fa-sun-o:before{content:"\f185"}.fa-moon-o:before{content:"\f186"}.fa-archive:before{content:"\f187"}.fa-bug:before{content:"\f188"}.fa-vk:before{content:"\f189"}.fa-weibo:before{content:"\f18a"}.fa-renren:before{content:"\f18b"}.fa-pagelines:before{content:"\f18c"}.fa-stack-exchange:before{content:"\f18d"}.fa-arrow-circle-o-right:before{content:"\f18e"}.fa-arrow-circle-o-left:before{content:"\f190"}.fa-toggle-left:before,.fa-caret-square-o-left:before{content:"\f191"}.fa-dot-circle-o:before{content:"\f192"}.fa-wheelchair:before{content:"\f193"}.fa-vimeo-square:before{content:"\f194"}.fa-turkish-lira:before,.fa-try:before{content:"\f195"}.fa-plus-square-o:before{content:"\f196"}.fa-space-shuttle:before{content:"\f197"}.fa-slack:before{content:"\f198"}.fa-envelope-square:before{content:"\f199"}.fa-wordpress:before{content:"\f19a"}.fa-openid:before{content:"\f19b"}.fa-institution:before,.fa-bank:before,.fa-university:before{content:"\f19c"}.fa-mortar-board:before,.fa-graduation-cap:before{content:"\f19d"}.fa-yahoo:before{content:"\f19e"}.fa-google:before{content:"\f1a0"}.fa-reddit:before{content:"\f1a1"}.fa-reddit-square:before{content:"\f1a2"}.fa-stumbleupon-circle:before{content:"\f1a3"}.fa-stumbleupon:before{content:"\f1a4"}.fa-delicious:before{content:"\f1a5"}.fa-digg:before{content:"\f1a6"}.fa-pied-piper-pp:before{content:"\f1a7"}.fa-pied-piper-alt:before{content:"\f1a8"}.fa-drupal:before{content:"\f1a9"}.fa-joomla:before{content:"\f1aa"}.fa-language:before{content:"\f1ab"}.fa-fax:before{content:"\f1ac"}.fa-building:before{content:"\f1ad"}.fa-child:before{content:"\f1ae"}.fa-paw:before{content:"\f1b0"}.fa-spoon:before{content:"\f1b1"}.fa-cube:before{content:"\f1b2"}.fa-cubes:before{content:"\f1b3"}.fa-behance:before{content:"\f1b4"}.fa-behance-square:before{content:"\f1b5"}.fa-steam:before{content:"\f1b6"}.fa-steam-square:before{content:"\f1b7"}.fa-recycle:before{content:"\f1b8"}.fa-automobile:before,.fa-car:before{content:"\f1b9"}.fa-cab:before,.fa-taxi:before{content:"\f1ba"}.fa-tree:before{content:"\f1bb"}.fa-spotify:before{content:"\f1bc"}.fa-deviantart:before{content:"\f1bd"}.fa-soundcloud:before{content:"\f1be"}.fa-database:before{content:"\f1c0"}.fa-file-pdf-o:before{content:"\f1c1"}.fa-file-word-o:before{content:"\f1c2"}.fa-file-excel-o:before{content:"\f1c3"}.fa-file-powerpoint-o:before{content:"\f1c4"}.fa-file-photo-o:before,.fa-file-picture-o:before,.fa-file-image-o:before{content:"\f1c5"}.fa-file-zip-o:before,.fa-file-archive-o:before{content:"\f1c6"}.fa-file-sound-o:before,.fa-file-audio-o:before{content:"\f1c7"}.fa-file-movie-o:before,.fa-file-video-o:before{content:"\f1c8"}.fa-file-code-o:before{content:"\f1c9"}.fa-vine:before{content:"\f1ca"}.fa-codepen:before{content:"\f1cb"}.fa-jsfiddle:before{content:"\f1cc"}.fa-life-bouy:before,.fa-life-buoy:before,.fa-life-saver:before,.fa-support:before,.fa-life-ring:before{content:"\f1cd"}.fa-circle-o-notch:before{content:"\f1ce"}.fa-ra:before,.fa-resistance:before,.fa-rebel:before{content:"\f1d0"}.fa-ge:before,.fa-empire:before{content:"\f1d1"}.fa-git-square:before{content:"\f1d2"}.fa-git:before{content:"\f1d3"}.fa-y-combinator-square:before,.fa-yc-square:before,.fa-hacker-news:before{content:"\f1d4"}.fa-tencent-weibo:before{content:"\f1d5"}.fa-qq:before{content:"\f1d6"}.fa-wechat:before,.fa-weixin:before{content:"\f1d7"}.fa-send:before,.fa-paper-plane:before{content:"\f1d8"}.fa-send-o:before,.fa-paper-plane-o:before{content:"\f1d9"}.fa-history:before{content:"\f1da"}.fa-circle-thin:before{content:"\f1db"}.fa-header:before{content:"\f1dc"}.fa-paragraph:before{content:"\f1dd"}.fa-sliders:before{content:"\f1de"}.fa-share-alt:before{content:"\f1e0"}.fa-share-alt-square:before{content:"\f1e1"}.fa-bomb:before{content:"\f1e2"}.fa-soccer-ball-o:before,.fa-futbol-o:before{content:"\f1e3"}.fa-tty:before{content:"\f1e4"}.fa-binoculars:before{content:"\f1e5"}.fa-plug:before{content:"\f1e6"}.fa-slideshare:before{content:"\f1e7"}.fa-twitch:before{content:"\f1e8"}.fa-yelp:before{content:"\f1e9"}.fa-newspaper-o:before{content:"\f1ea"}.fa-wifi:before{content:"\f1eb"}.fa-calculator:before{content:"\f1ec"}.fa-paypal:before{content:"\f1ed"}.fa-google-wallet:before{content:"\f1ee"}.fa-cc-visa:before{content:"\f1f0"}.fa-cc-mastercard:before{content:"\f1f1"}.fa-cc-discover:before{content:"\f1f2"}.fa-cc-amex:before{content:"\f1f3"}.fa-cc-paypal:before{content:"\f1f4"}.fa-cc-stripe:before{content:"\f1f5"}.fa-bell-slash:before{content:"\f1f6"}.fa-bell-slash-o:before{content:"\f1f7"}.fa-trash:before{content:"\f1f8"}.fa-copyright:before{content:"\f1f9"}.fa-at:before{content:"\f1fa"}.fa-eyedropper:before{content:"\f1fb"}.fa-paint-brush:before{content:"\f1fc"}.fa-birthday-cake:before{content:"\f1fd"}.fa-area-chart:before{content:"\f1fe"}.fa-pie-chart:before{content:"\f200"}.fa-line-chart:before{content:"\f201"}.fa-lastfm:before{content:"\f202"}.fa-lastfm-square:before{content:"\f203"}.fa-toggle-off:before{content:"\f204"}.fa-toggle-on:before{content:"\f205"}.fa-bicycle:before{content:"\f206"}.fa-bus:before{content:"\f207"}.fa-ioxhost:before{content:"\f208"}.fa-angellist:before{content:"\f209"}.fa-cc:before{content:"\f20a"}.fa-shekel:before,.fa-sheqel:before,.fa-ils:before{content:"\f20b"}.fa-meanpath:before{content:"\f20c"}.fa-buysellads:before{content:"\f20d"}.fa-connectdevelop:before{content:"\f20e"}.fa-dashcube:before{content:"\f210"}.fa-forumbee:before{content:"\f211"}.fa-leanpub:before{content:"\f212"}.fa-sellsy:before{content:"\f213"}.fa-shirtsinbulk:before{content:"\f214"}.fa-simplybuilt:before{content:"\f215"}.fa-skyatlas:before{content:"\f216"}.fa-cart-plus:before{content:"\f217"}.fa-cart-arrow-down:before{content:"\f218"}.fa-diamond:before{content:"\f219"}.fa-ship:before{content:"\f21a"}.fa-user-secret:before{content:"\f21b"}.fa-motorcycle:before{content:"\f21c"}.fa-street-view:before{content:"\f21d"}.fa-heartbeat:before{content:"\f21e"}.fa-venus:before{content:"\f221"}.fa-mars:before{content:"\f222"}.fa-mercury:before{content:"\f223"}.fa-intersex:before,.fa-transgender:before{content:"\f224"}.fa-transgender-alt:before{content:"\f225"}.fa-venus-double:before{content:"\f226"}.fa-mars-double:before{content:"\f227"}.fa-venus-mars:before{content:"\f228"}.fa-mars-stroke:before{content:"\f229"}.fa-mars-stroke-v:before{content:"\f22a"}.fa-mars-stroke-h:before{content:"\f22b"}.fa-neuter:before{content:"\f22c"}.fa-genderless:before{content:"\f22d"}.fa-facebook-official:before{content:"\f230"}.fa-pinterest-p:before{content:"\f231"}.fa-whatsapp:before{content:"\f232"}.fa-server:before{content:"\f233"}.fa-user-plus:before{content:"\f234"}.fa-user-times:before{content:"\f235"}.fa-hotel:before,.fa-bed:before{content:"\f236"}.fa-viacoin:before{content:"\f237"}.fa-train:before{content:"\f238"}.fa-subway:before{content:"\f239"}.fa-medium:before{content:"\f23a"}.fa-yc:before,.fa-y-combinator:before{content:"\f23b"}.fa-optin-monster:before{content:"\f23c"}.fa-opencart:before{content:"\f23d"}.fa-expeditedssl:before{content:"\f23e"}.fa-battery-4:before,.fa-battery:before,.fa-battery-full:before{content:"\f240"}.fa-battery-3:before,.fa-battery-three-quarters:before{content:"\f241"}.fa-battery-2:before,.fa-battery-half:before{content:"\f242"}.fa-battery-1:before,.fa-battery-quarter:before{content:"\f243"}.fa-battery-0:before,.fa-battery-empty:before{content:"\f244"}.fa-mouse-pointer:before{content:"\f245"}.fa-i-cursor:before{content:"\f246"}.fa-object-group:before{content:"\f247"}.fa-object-ungroup:before{content:"\f248"}.fa-sticky-note:before{content:"\f249"}.fa-sticky-note-o:before{content:"\f24a"}.fa-cc-jcb:before{content:"\f24b"}.fa-cc-diners-club:before{content:"\f24c"}.fa-clone:before{content:"\f24d"}.fa-balance-scale:before{content:"\f24e"}.fa-hourglass-o:before{content:"\f250"}.fa-hourglass-1:before,.fa-hourglass-start:before{content:"\f251"}.fa-hourglass-2:before,.fa-hourglass-half:before{content:"\f252"}.fa-hourglass-3:before,.fa-hourglass-end:before{content:"\f253"}.fa-hourglass:before{content:"\f254"}.fa-hand-grab-o:before,.fa-hand-rock-o:before{content:"\f255"}.fa-hand-stop-o:before,.fa-hand-paper-o:before{content:"\f256"}.fa-hand-scissors-o:before{content:"\f257"}.fa-hand-lizard-o:before{content:"\f258"}.fa-hand-spock-o:before{content:"\f259"}.fa-hand-pointer-o:before{content:"\f25a"}.fa-hand-peace-o:before{content:"\f25b"}.fa-trademark:before{content:"\f25c"}.fa-registered:before{content:"\f25d"}.fa-creative-commons:before{content:"\f25e"}.fa-gg:before{content:"\f260"}.fa-gg-circle:before{content:"\f261"}.fa-tripadvisor:before{content:"\f262"}.fa-odnoklassniki:before{content:"\f263"}.fa-odnoklassniki-square:before{content:"\f264"}.fa-get-pocket:before{content:"\f265"}.fa-wikipedia-w:before{content:"\f266"}.fa-safari:before{content:"\f267"}.fa-chrome:before{content:"\f268"}.fa-firefox:before{content:"\f269"}.fa-opera:before{content:"\f26a"}.fa-internet-explorer:before{content:"\f26b"}.fa-tv:before,.fa-television:before{content:"\f26c"}.fa-contao:before{content:"\f26d"}.fa-500px:before{content:"\f26e"}.fa-amazon:before{content:"\f270"}.fa-calendar-plus-o:before{content:"\f271"}.fa-calendar-minus-o:before{content:"\f272"}.fa-calendar-times-o:before{content:"\f273"}.fa-calendar-check-o:before{content:"\f274"}.fa-industry:before{content:"\f275"}.fa-map-pin:before{content:"\f276"}.fa-map-signs:before{content:"\f277"}.fa-map-o:before{content:"\f278"}.fa-map:before{content:"\f279"}.fa-commenting:before{content:"\f27a"}.fa-commenting-o:before{content:"\f27b"}.fa-houzz:before{content:"\f27c"}.fa-vimeo:before{content:"\f27d"}.fa-black-tie:before{content:"\f27e"}.fa-fonticons:before{content:"\f280"}.fa-reddit-alien:before{content:"\f281"}.fa-edge:before{content:"\f282"}.fa-credit-card-alt:before{content:"\f283"}.fa-codiepie:before{content:"\f284"}.fa-modx:before{content:"\f285"}.fa-fort-awesome:before{content:"\f286"}.fa-usb:before{content:"\f287"}.fa-product-hunt:before{content:"\f288"}.fa-mixcloud:before{content:"\f289"}.fa-scribd:before{content:"\f28a"}.fa-pause-circle:before{content:"\f28b"}.fa-pause-circle-o:before{content:"\f28c"}.fa-stop-circle:before{content:"\f28d"}.fa-stop-circle-o:before{content:"\f28e"}.fa-shopping-bag:before{content:"\f290"}.fa-shopping-basket:before{content:"\f291"}.fa-hashtag:before{content:"\f292"}.fa-bluetooth:before{content:"\f293"}.fa-bluetooth-b:before{content:"\f294"}.fa-percent:before{content:"\f295"}.fa-gitlab:before{content:"\f296"}.fa-wpbeginner:before{content:"\f297"}.fa-wpforms:before{content:"\f298"}.fa-envira:before{content:"\f299"}.fa-universal-access:before{content:"\f29a"}.fa-wheelchair-alt:before{content:"\f29b"}.fa-question-circle-o:before{content:"\f29c"}.fa-blind:before{content:"\f29d"}.fa-audio-description:before{content:"\f29e"}.fa-volume-control-phone:before{content:"\f2a0"}.fa-braille:before{content:"\f2a1"}.fa-assistive-listening-systems:before{content:"\f2a2"}.fa-asl-interpreting:before,.fa-american-sign-language-interpreting:before{content:"\f2a3"}.fa-deafness:before,.fa-hard-of-hearing:before,.fa-deaf:before{content:"\f2a4"}.fa-glide:before{content:"\f2a5"}.fa-glide-g:before{content:"\f2a6"}.fa-signing:before,.fa-sign-language:before{content:"\f2a7"}.fa-low-vision:before{content:"\f2a8"}.fa-viadeo:before{content:"\f2a9"}.fa-viadeo-square:before{content:"\f2aa"}.fa-snapchat:before{content:"\f2ab"}.fa-snapchat-ghost:before{content:"\f2ac"}.fa-snapchat-square:before{content:"\f2ad"}.fa-pied-piper:before{content:"\f2ae"}.fa-first-order:before{content:"\f2b0"}.fa-yoast:before{content:"\f2b1"}.fa-themeisle:before{content:"\f2b2"}.fa-google-plus-circle:before,.fa-google-plus-official:before{content:"\f2b3"}.fa-fa:before,.fa-font-awesome:before{content:"\f2b4"}.fa-handshake-o:before{content:"\f2b5"}.fa-envelope-open:before{content:"\f2b6"}.fa-envelope-open-o:before{content:"\f2b7"}.fa-linode:before{content:"\f2b8"}.fa-address-book:before{content:"\f2b9"}.fa-address-book-o:before{content:"\f2ba"}.fa-vcard:before,.fa-address-card:before{content:"\f2bb"}.fa-vcard-o:before,.fa-address-card-o:before{content:"\f2bc"}.fa-user-circle:before{content:"\f2bd"}.fa-user-circle-o:before{content:"\f2be"}.fa-user-o:before{content:"\f2c0"}.fa-id-badge:before{content:"\f2c1"}.fa-drivers-license:before,.fa-id-card:before{content:"\f2c2"}.fa-drivers-license-o:before,.fa-id-card-o:before{content:"\f2c3"}.fa-quora:before{content:"\f2c4"}.fa-free-code-camp:before{content:"\f2c5"}.fa-telegram:before{content:"\f2c6"}.fa-thermometer-4:before,.fa-thermometer:before,.fa-thermometer-full:before{content:"\f2c7"}.fa-thermometer-3:before,.fa-thermometer-three-quarters:before{content:"\f2c8"}.fa-thermometer-2:before,.fa-thermometer-half:before{content:"\f2c9"}.fa-thermometer-1:before,.fa-thermometer-quarter:before{content:"\f2ca"}.fa-thermometer-0:before,.fa-thermometer-empty:before{content:"\f2cb"}.fa-shower:before{content:"\f2cc"}.fa-bathtub:before,.fa-s15:before,.fa-bath:before{content:"\f2cd"}.fa-podcast:before{content:"\f2ce"}.fa-window-maximize:before{content:"\f2d0"}.fa-window-minimize:before{content:"\f2d1"}.fa-window-restore:before{content:"\f2d2"}.fa-times-rectangle:before,.fa-window-close:before{content:"\f2d3"}.fa-times-rectangle-o:before,.fa-window-close-o:before{content:"\f2d4"}.fa-bandcamp:before{content:"\f2d5"}.fa-grav:before{content:"\f2d6"}.fa-etsy:before{content:"\f2d7"}.fa-imdb:before{content:"\f2d8"}.fa-ravelry:before{content:"\f2d9"}.fa-eercast:before{content:"\f2da"}.fa-microchip:before{content:"\f2db"}.fa-snowflake-o:before{content:"\f2dc"}.fa-superpowers:before{content:"\f2dd"}.fa-wpexplorer:before{content:"\f2de"}.fa-meetup:before{content:"\f2e0"}.sr-only{position:absolute;width:1px;height:1px;padding:0;margin:-1px;overflow:hidden;clip:rect(0, 0, 0, 0);border:0}.sr-only-focusable:active,.sr-only-focusable:focus{position:static;width:auto;height:auto;margin:0;overflow:visible;clip:auto} diff --git a/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/css/index.html b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/css/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/css/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/FontAwesome.otf b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/FontAwesome.otf new file mode 100644 index 0000000000000000000000000000000000000000..401ec0f36e4f73b8efa40bd6f604fe80d286db70 Binary files /dev/null and b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/FontAwesome.otf differ diff --git a/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.eot b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.eot new file mode 100644 index 0000000000000000000000000000000000000000..e9f60ca953f93e35eab4108bd414bc02ddcf3928 Binary files /dev/null and b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.eot differ diff --git a/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.svg b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.svg new file mode 100644 index 0000000000000000000000000000000000000000..855c845e538b65548118279537a04eab2ec6ef0d --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.svg @@ -0,0 +1,2671 @@ + + + + +Created by FontForge 20120731 at Mon Oct 24 17:37:40 2016 + By ,,, +Copyright Dave Gandy 2016. All rights reserved. + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.ttf b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.ttf new file mode 100644 index 0000000000000000000000000000000000000000..35acda2fa1196aad98c2adf4378a7611dd713aa3 Binary files /dev/null and b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.ttf differ diff --git a/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.woff b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.woff new file mode 100644 index 0000000000000000000000000000000000000000..400014a4b06eee3d0c0d54402a47ab2601b2862b Binary files /dev/null and b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.woff differ diff --git a/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.woff2 b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.woff2 new file mode 100644 index 0000000000000000000000000000000000000000..4d13fc60404b91e398a37200c4a77b645cfd9586 Binary files /dev/null and b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/fontawesome-webfont.woff2 differ diff --git a/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/index.html b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/fonts/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/index.html b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/font-awesome/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/index.html b/2_services/1_metaverse/nodam/assets/frameworks/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/ionicons/css/index.html b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/css/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/css/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/ionicons/css/ionicons.min.css b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/css/ionicons.min.css new file mode 100644 index 0000000000000000000000000000000000000000..baba9e930710d86d31461a9a9f9a9f0307247b99 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/css/ionicons.min.css @@ -0,0 +1,11 @@ +@charset "UTF-8";/*! + Ionicons, v2.0.0 + Created by Ben Sperry for the Ionic Framework, http://ionicons.com/ + https://twitter.com/benjsperry https://twitter.com/ionicframework + MIT License: https://github.com/driftyco/ionicons + + Android-style icons originally built by Google’s + Material Design Icons: https://github.com/google/material-design-icons + used under CC BY http://creativecommons.org/licenses/by/4.0/ + Modified icons to fit ionicon’s grid from original. +*/@font-face{font-family:"Ionicons";src:url("../fonts/ionicons.eot?v=2.0.0");src:url("../fonts/ionicons.eot?v=2.0.0#iefix") format("embedded-opentype"),url("../fonts/ionicons.ttf?v=2.0.0") format("truetype"),url("../fonts/ionicons.woff?v=2.0.0") format("woff"),url("../fonts/ionicons.svg?v=2.0.0#Ionicons") format("svg");font-weight:normal;font-style:normal}.ion,.ionicons,.ion-alert:before,.ion-alert-circled:before,.ion-android-add:before,.ion-android-add-circle:before,.ion-android-alarm-clock:before,.ion-android-alert:before,.ion-android-apps:before,.ion-android-archive:before,.ion-android-arrow-back:before,.ion-android-arrow-down:before,.ion-android-arrow-dropdown:before,.ion-android-arrow-dropdown-circle:before,.ion-android-arrow-dropleft:before,.ion-android-arrow-dropleft-circle:before,.ion-android-arrow-dropright:before,.ion-android-arrow-dropright-circle:before,.ion-android-arrow-dropup:before,.ion-android-arrow-dropup-circle:before,.ion-android-arrow-forward:before,.ion-android-arrow-up:before,.ion-android-attach:before,.ion-android-bar:before,.ion-android-bicycle:before,.ion-android-boat:before,.ion-android-bookmark:before,.ion-android-bulb:before,.ion-android-bus:before,.ion-android-calendar:before,.ion-android-call:before,.ion-android-camera:before,.ion-android-cancel:before,.ion-android-car:before,.ion-android-cart:before,.ion-android-chat:before,.ion-android-checkbox:before,.ion-android-checkbox-blank:before,.ion-android-checkbox-outline:before,.ion-android-checkbox-outline-blank:before,.ion-android-checkmark-circle:before,.ion-android-clipboard:before,.ion-android-close:before,.ion-android-cloud:before,.ion-android-cloud-circle:before,.ion-android-cloud-done:before,.ion-android-cloud-outline:before,.ion-android-color-palette:before,.ion-android-compass:before,.ion-android-contact:before,.ion-android-contacts:before,.ion-android-contract:before,.ion-android-create:before,.ion-android-delete:before,.ion-android-desktop:before,.ion-android-document:before,.ion-android-done:before,.ion-android-done-all:before,.ion-android-download:before,.ion-android-drafts:before,.ion-android-exit:before,.ion-android-expand:before,.ion-android-favorite:before,.ion-android-favorite-outline:before,.ion-android-film:before,.ion-android-folder:before,.ion-android-folder-open:before,.ion-android-funnel:before,.ion-android-globe:before,.ion-android-hand:before,.ion-android-hangout:before,.ion-android-happy:before,.ion-android-home:before,.ion-android-image:before,.ion-android-laptop:before,.ion-android-list:before,.ion-android-locate:before,.ion-android-lock:before,.ion-android-mail:before,.ion-android-map:before,.ion-android-menu:before,.ion-android-microphone:before,.ion-android-microphone-off:before,.ion-android-more-horizontal:before,.ion-android-more-vertical:before,.ion-android-navigate:before,.ion-android-notifications:before,.ion-android-notifications-none:before,.ion-android-notifications-off:before,.ion-android-open:before,.ion-android-options:before,.ion-android-people:before,.ion-android-person:before,.ion-android-person-add:before,.ion-android-phone-landscape:before,.ion-android-phone-portrait:before,.ion-android-pin:before,.ion-android-plane:before,.ion-android-playstore:before,.ion-android-print:before,.ion-android-radio-button-off:before,.ion-android-radio-button-on:before,.ion-android-refresh:before,.ion-android-remove:before,.ion-android-remove-circle:before,.ion-android-restaurant:before,.ion-android-sad:before,.ion-android-search:before,.ion-android-send:before,.ion-android-settings:before,.ion-android-share:before,.ion-android-share-alt:before,.ion-android-star:before,.ion-android-star-half:before,.ion-android-star-outline:before,.ion-android-stopwatch:before,.ion-android-subway:before,.ion-android-sunny:before,.ion-android-sync:before,.ion-android-textsms:before,.ion-android-time:before,.ion-android-train:before,.ion-android-unlock:before,.ion-android-upload:before,.ion-android-volume-down:before,.ion-android-volume-mute:before,.ion-android-volume-off:before,.ion-android-volume-up:before,.ion-android-walk:before,.ion-android-warning:before,.ion-android-watch:before,.ion-android-wifi:before,.ion-aperture:before,.ion-archive:before,.ion-arrow-down-a:before,.ion-arrow-down-b:before,.ion-arrow-down-c:before,.ion-arrow-expand:before,.ion-arrow-graph-down-left:before,.ion-arrow-graph-down-right:before,.ion-arrow-graph-up-left:before,.ion-arrow-graph-up-right:before,.ion-arrow-left-a:before,.ion-arrow-left-b:before,.ion-arrow-left-c:before,.ion-arrow-move:before,.ion-arrow-resize:before,.ion-arrow-return-left:before,.ion-arrow-return-right:before,.ion-arrow-right-a:before,.ion-arrow-right-b:before,.ion-arrow-right-c:before,.ion-arrow-shrink:before,.ion-arrow-swap:before,.ion-arrow-up-a:before,.ion-arrow-up-b:before,.ion-arrow-up-c:before,.ion-asterisk:before,.ion-at:before,.ion-backspace:before,.ion-backspace-outline:before,.ion-bag:before,.ion-battery-charging:before,.ion-battery-empty:before,.ion-battery-full:before,.ion-battery-half:before,.ion-battery-low:before,.ion-beaker:before,.ion-beer:before,.ion-bluetooth:before,.ion-bonfire:before,.ion-bookmark:before,.ion-bowtie:before,.ion-briefcase:before,.ion-bug:before,.ion-calculator:before,.ion-calendar:before,.ion-camera:before,.ion-card:before,.ion-cash:before,.ion-chatbox:before,.ion-chatbox-working:before,.ion-chatboxes:before,.ion-chatbubble:before,.ion-chatbubble-working:before,.ion-chatbubbles:before,.ion-checkmark:before,.ion-checkmark-circled:before,.ion-checkmark-round:before,.ion-chevron-down:before,.ion-chevron-left:before,.ion-chevron-right:before,.ion-chevron-up:before,.ion-clipboard:before,.ion-clock:before,.ion-close:before,.ion-close-circled:before,.ion-close-round:before,.ion-closed-captioning:before,.ion-cloud:before,.ion-code:before,.ion-code-download:before,.ion-code-working:before,.ion-coffee:before,.ion-compass:before,.ion-compose:before,.ion-connection-bars:before,.ion-contrast:before,.ion-crop:before,.ion-cube:before,.ion-disc:before,.ion-document:before,.ion-document-text:before,.ion-drag:before,.ion-earth:before,.ion-easel:before,.ion-edit:before,.ion-egg:before,.ion-eject:before,.ion-email:before,.ion-email-unread:before,.ion-erlenmeyer-flask:before,.ion-erlenmeyer-flask-bubbles:before,.ion-eye:before,.ion-eye-disabled:before,.ion-female:before,.ion-filing:before,.ion-film-marker:before,.ion-fireball:before,.ion-flag:before,.ion-flame:before,.ion-flash:before,.ion-flash-off:before,.ion-folder:before,.ion-fork:before,.ion-fork-repo:before,.ion-forward:before,.ion-funnel:before,.ion-gear-a:before,.ion-gear-b:before,.ion-grid:before,.ion-hammer:before,.ion-happy:before,.ion-happy-outline:before,.ion-headphone:before,.ion-heart:before,.ion-heart-broken:before,.ion-help:before,.ion-help-buoy:before,.ion-help-circled:before,.ion-home:before,.ion-icecream:before,.ion-image:before,.ion-images:before,.ion-information:before,.ion-information-circled:before,.ion-ionic:before,.ion-ios-alarm:before,.ion-ios-alarm-outline:before,.ion-ios-albums:before,.ion-ios-albums-outline:before,.ion-ios-americanfootball:before,.ion-ios-americanfootball-outline:before,.ion-ios-analytics:before,.ion-ios-analytics-outline:before,.ion-ios-arrow-back:before,.ion-ios-arrow-down:before,.ion-ios-arrow-forward:before,.ion-ios-arrow-left:before,.ion-ios-arrow-right:before,.ion-ios-arrow-thin-down:before,.ion-ios-arrow-thin-left:before,.ion-ios-arrow-thin-right:before,.ion-ios-arrow-thin-up:before,.ion-ios-arrow-up:before,.ion-ios-at:before,.ion-ios-at-outline:before,.ion-ios-barcode:before,.ion-ios-barcode-outline:before,.ion-ios-baseball:before,.ion-ios-baseball-outline:before,.ion-ios-basketball:before,.ion-ios-basketball-outline:before,.ion-ios-bell:before,.ion-ios-bell-outline:before,.ion-ios-body:before,.ion-ios-body-outline:before,.ion-ios-bolt:before,.ion-ios-bolt-outline:before,.ion-ios-book:before,.ion-ios-book-outline:before,.ion-ios-bookmarks:before,.ion-ios-bookmarks-outline:before,.ion-ios-box:before,.ion-ios-box-outline:before,.ion-ios-briefcase:before,.ion-ios-briefcase-outline:before,.ion-ios-browsers:before,.ion-ios-browsers-outline:before,.ion-ios-calculator:before,.ion-ios-calculator-outline:before,.ion-ios-calendar:before,.ion-ios-calendar-outline:before,.ion-ios-camera:before,.ion-ios-camera-outline:before,.ion-ios-cart:before,.ion-ios-cart-outline:before,.ion-ios-chatboxes:before,.ion-ios-chatboxes-outline:before,.ion-ios-chatbubble:before,.ion-ios-chatbubble-outline:before,.ion-ios-checkmark:before,.ion-ios-checkmark-empty:before,.ion-ios-checkmark-outline:before,.ion-ios-circle-filled:before,.ion-ios-circle-outline:before,.ion-ios-clock:before,.ion-ios-clock-outline:before,.ion-ios-close:before,.ion-ios-close-empty:before,.ion-ios-close-outline:before,.ion-ios-cloud:before,.ion-ios-cloud-download:before,.ion-ios-cloud-download-outline:before,.ion-ios-cloud-outline:before,.ion-ios-cloud-upload:before,.ion-ios-cloud-upload-outline:before,.ion-ios-cloudy:before,.ion-ios-cloudy-night:before,.ion-ios-cloudy-night-outline:before,.ion-ios-cloudy-outline:before,.ion-ios-cog:before,.ion-ios-cog-outline:before,.ion-ios-color-filter:before,.ion-ios-color-filter-outline:before,.ion-ios-color-wand:before,.ion-ios-color-wand-outline:before,.ion-ios-compose:before,.ion-ios-compose-outline:before,.ion-ios-contact:before,.ion-ios-contact-outline:before,.ion-ios-copy:before,.ion-ios-copy-outline:before,.ion-ios-crop:before,.ion-ios-crop-strong:before,.ion-ios-download:before,.ion-ios-download-outline:before,.ion-ios-drag:before,.ion-ios-email:before,.ion-ios-email-outline:before,.ion-ios-eye:before,.ion-ios-eye-outline:before,.ion-ios-fastforward:before,.ion-ios-fastforward-outline:before,.ion-ios-filing:before,.ion-ios-filing-outline:before,.ion-ios-film:before,.ion-ios-film-outline:before,.ion-ios-flag:before,.ion-ios-flag-outline:before,.ion-ios-flame:before,.ion-ios-flame-outline:before,.ion-ios-flask:before,.ion-ios-flask-outline:before,.ion-ios-flower:before,.ion-ios-flower-outline:before,.ion-ios-folder:before,.ion-ios-folder-outline:before,.ion-ios-football:before,.ion-ios-football-outline:before,.ion-ios-game-controller-a:before,.ion-ios-game-controller-a-outline:before,.ion-ios-game-controller-b:before,.ion-ios-game-controller-b-outline:before,.ion-ios-gear:before,.ion-ios-gear-outline:before,.ion-ios-glasses:before,.ion-ios-glasses-outline:before,.ion-ios-grid-view:before,.ion-ios-grid-view-outline:before,.ion-ios-heart:before,.ion-ios-heart-outline:before,.ion-ios-help:before,.ion-ios-help-empty:before,.ion-ios-help-outline:before,.ion-ios-home:before,.ion-ios-home-outline:before,.ion-ios-infinite:before,.ion-ios-infinite-outline:before,.ion-ios-information:before,.ion-ios-information-empty:before,.ion-ios-information-outline:before,.ion-ios-ionic-outline:before,.ion-ios-keypad:before,.ion-ios-keypad-outline:before,.ion-ios-lightbulb:before,.ion-ios-lightbulb-outline:before,.ion-ios-list:before,.ion-ios-list-outline:before,.ion-ios-location:before,.ion-ios-location-outline:before,.ion-ios-locked:before,.ion-ios-locked-outline:before,.ion-ios-loop:before,.ion-ios-loop-strong:before,.ion-ios-medical:before,.ion-ios-medical-outline:before,.ion-ios-medkit:before,.ion-ios-medkit-outline:before,.ion-ios-mic:before,.ion-ios-mic-off:before,.ion-ios-mic-outline:before,.ion-ios-minus:before,.ion-ios-minus-empty:before,.ion-ios-minus-outline:before,.ion-ios-monitor:before,.ion-ios-monitor-outline:before,.ion-ios-moon:before,.ion-ios-moon-outline:before,.ion-ios-more:before,.ion-ios-more-outline:before,.ion-ios-musical-note:before,.ion-ios-musical-notes:before,.ion-ios-navigate:before,.ion-ios-navigate-outline:before,.ion-ios-nutrition:before,.ion-ios-nutrition-outline:before,.ion-ios-paper:before,.ion-ios-paper-outline:before,.ion-ios-paperplane:before,.ion-ios-paperplane-outline:before,.ion-ios-partlysunny:before,.ion-ios-partlysunny-outline:before,.ion-ios-pause:before,.ion-ios-pause-outline:before,.ion-ios-paw:before,.ion-ios-paw-outline:before,.ion-ios-people:before,.ion-ios-people-outline:before,.ion-ios-person:before,.ion-ios-person-outline:before,.ion-ios-personadd:before,.ion-ios-personadd-outline:before,.ion-ios-photos:before,.ion-ios-photos-outline:before,.ion-ios-pie:before,.ion-ios-pie-outline:before,.ion-ios-pint:before,.ion-ios-pint-outline:before,.ion-ios-play:before,.ion-ios-play-outline:before,.ion-ios-plus:before,.ion-ios-plus-empty:before,.ion-ios-plus-outline:before,.ion-ios-pricetag:before,.ion-ios-pricetag-outline:before,.ion-ios-pricetags:before,.ion-ios-pricetags-outline:before,.ion-ios-printer:before,.ion-ios-printer-outline:before,.ion-ios-pulse:before,.ion-ios-pulse-strong:before,.ion-ios-rainy:before,.ion-ios-rainy-outline:before,.ion-ios-recording:before,.ion-ios-recording-outline:before,.ion-ios-redo:before,.ion-ios-redo-outline:before,.ion-ios-refresh:before,.ion-ios-refresh-empty:before,.ion-ios-refresh-outline:before,.ion-ios-reload:before,.ion-ios-reverse-camera:before,.ion-ios-reverse-camera-outline:before,.ion-ios-rewind:before,.ion-ios-rewind-outline:before,.ion-ios-rose:before,.ion-ios-rose-outline:before,.ion-ios-search:before,.ion-ios-search-strong:before,.ion-ios-settings:before,.ion-ios-settings-strong:before,.ion-ios-shuffle:before,.ion-ios-shuffle-strong:before,.ion-ios-skipbackward:before,.ion-ios-skipbackward-outline:before,.ion-ios-skipforward:before,.ion-ios-skipforward-outline:before,.ion-ios-snowy:before,.ion-ios-speedometer:before,.ion-ios-speedometer-outline:before,.ion-ios-star:before,.ion-ios-star-half:before,.ion-ios-star-outline:before,.ion-ios-stopwatch:before,.ion-ios-stopwatch-outline:before,.ion-ios-sunny:before,.ion-ios-sunny-outline:before,.ion-ios-telephone:before,.ion-ios-telephone-outline:before,.ion-ios-tennisball:before,.ion-ios-tennisball-outline:before,.ion-ios-thunderstorm:before,.ion-ios-thunderstorm-outline:before,.ion-ios-time:before,.ion-ios-time-outline:before,.ion-ios-timer:before,.ion-ios-timer-outline:before,.ion-ios-toggle:before,.ion-ios-toggle-outline:before,.ion-ios-trash:before,.ion-ios-trash-outline:before,.ion-ios-undo:before,.ion-ios-undo-outline:before,.ion-ios-unlocked:before,.ion-ios-unlocked-outline:before,.ion-ios-upload:before,.ion-ios-upload-outline:before,.ion-ios-videocam:before,.ion-ios-videocam-outline:before,.ion-ios-volume-high:before,.ion-ios-volume-low:before,.ion-ios-wineglass:before,.ion-ios-wineglass-outline:before,.ion-ios-world:before,.ion-ios-world-outline:before,.ion-ipad:before,.ion-iphone:before,.ion-ipod:before,.ion-jet:before,.ion-key:before,.ion-knife:before,.ion-laptop:before,.ion-leaf:before,.ion-levels:before,.ion-lightbulb:before,.ion-link:before,.ion-load-a:before,.ion-load-b:before,.ion-load-c:before,.ion-load-d:before,.ion-location:before,.ion-lock-combination:before,.ion-locked:before,.ion-log-in:before,.ion-log-out:before,.ion-loop:before,.ion-magnet:before,.ion-male:before,.ion-man:before,.ion-map:before,.ion-medkit:before,.ion-merge:before,.ion-mic-a:before,.ion-mic-b:before,.ion-mic-c:before,.ion-minus:before,.ion-minus-circled:before,.ion-minus-round:before,.ion-model-s:before,.ion-monitor:before,.ion-more:before,.ion-mouse:before,.ion-music-note:before,.ion-navicon:before,.ion-navicon-round:before,.ion-navigate:before,.ion-network:before,.ion-no-smoking:before,.ion-nuclear:before,.ion-outlet:before,.ion-paintbrush:before,.ion-paintbucket:before,.ion-paper-airplane:before,.ion-paperclip:before,.ion-pause:before,.ion-person:before,.ion-person-add:before,.ion-person-stalker:before,.ion-pie-graph:before,.ion-pin:before,.ion-pinpoint:before,.ion-pizza:before,.ion-plane:before,.ion-planet:before,.ion-play:before,.ion-playstation:before,.ion-plus:before,.ion-plus-circled:before,.ion-plus-round:before,.ion-podium:before,.ion-pound:before,.ion-power:before,.ion-pricetag:before,.ion-pricetags:before,.ion-printer:before,.ion-pull-request:before,.ion-qr-scanner:before,.ion-quote:before,.ion-radio-waves:before,.ion-record:before,.ion-refresh:before,.ion-reply:before,.ion-reply-all:before,.ion-ribbon-a:before,.ion-ribbon-b:before,.ion-sad:before,.ion-sad-outline:before,.ion-scissors:before,.ion-search:before,.ion-settings:before,.ion-share:before,.ion-shuffle:before,.ion-skip-backward:before,.ion-skip-forward:before,.ion-social-android:before,.ion-social-android-outline:before,.ion-social-angular:before,.ion-social-angular-outline:before,.ion-social-apple:before,.ion-social-apple-outline:before,.ion-social-bitcoin:before,.ion-social-bitcoin-outline:before,.ion-social-buffer:before,.ion-social-buffer-outline:before,.ion-social-chrome:before,.ion-social-chrome-outline:before,.ion-social-codepen:before,.ion-social-codepen-outline:before,.ion-social-css3:before,.ion-social-css3-outline:before,.ion-social-designernews:before,.ion-social-designernews-outline:before,.ion-social-dribbble:before,.ion-social-dribbble-outline:before,.ion-social-dropbox:before,.ion-social-dropbox-outline:before,.ion-social-euro:before,.ion-social-euro-outline:before,.ion-social-facebook:before,.ion-social-facebook-outline:before,.ion-social-foursquare:before,.ion-social-foursquare-outline:before,.ion-social-freebsd-devil:before,.ion-social-github:before,.ion-social-github-outline:before,.ion-social-google:before,.ion-social-google-outline:before,.ion-social-googleplus:before,.ion-social-googleplus-outline:before,.ion-social-hackernews:before,.ion-social-hackernews-outline:before,.ion-social-html5:before,.ion-social-html5-outline:before,.ion-social-instagram:before,.ion-social-instagram-outline:before,.ion-social-javascript:before,.ion-social-javascript-outline:before,.ion-social-linkedin:before,.ion-social-linkedin-outline:before,.ion-social-markdown:before,.ion-social-nodejs:before,.ion-social-octocat:before,.ion-social-pinterest:before,.ion-social-pinterest-outline:before,.ion-social-python:before,.ion-social-reddit:before,.ion-social-reddit-outline:before,.ion-social-rss:before,.ion-social-rss-outline:before,.ion-social-sass:before,.ion-social-skype:before,.ion-social-skype-outline:before,.ion-social-snapchat:before,.ion-social-snapchat-outline:before,.ion-social-tumblr:before,.ion-social-tumblr-outline:before,.ion-social-tux:before,.ion-social-twitch:before,.ion-social-twitch-outline:before,.ion-social-twitter:before,.ion-social-twitter-outline:before,.ion-social-usd:before,.ion-social-usd-outline:before,.ion-social-vimeo:before,.ion-social-vimeo-outline:before,.ion-social-whatsapp:before,.ion-social-whatsapp-outline:before,.ion-social-windows:before,.ion-social-windows-outline:before,.ion-social-wordpress:before,.ion-social-wordpress-outline:before,.ion-social-yahoo:before,.ion-social-yahoo-outline:before,.ion-social-yen:before,.ion-social-yen-outline:before,.ion-social-youtube:before,.ion-social-youtube-outline:before,.ion-soup-can:before,.ion-soup-can-outline:before,.ion-speakerphone:before,.ion-speedometer:before,.ion-spoon:before,.ion-star:before,.ion-stats-bars:before,.ion-steam:before,.ion-stop:before,.ion-thermometer:before,.ion-thumbsdown:before,.ion-thumbsup:before,.ion-toggle:before,.ion-toggle-filled:before,.ion-transgender:before,.ion-trash-a:before,.ion-trash-b:before,.ion-trophy:before,.ion-tshirt:before,.ion-tshirt-outline:before,.ion-umbrella:before,.ion-university:before,.ion-unlocked:before,.ion-upload:before,.ion-usb:before,.ion-videocamera:before,.ion-volume-high:before,.ion-volume-low:before,.ion-volume-medium:before,.ion-volume-mute:before,.ion-wand:before,.ion-waterdrop:before,.ion-wifi:before,.ion-wineglass:before,.ion-woman:before,.ion-wrench:before,.ion-xbox:before{display:inline-block;font-family:"Ionicons";speak:none;font-style:normal;font-weight:normal;font-variant:normal;text-transform:none;text-rendering:auto;line-height:1;-webkit-font-smoothing:antialiased;-moz-osx-font-smoothing:grayscale}.ion-alert:before{content:"\f101"}.ion-alert-circled:before{content:"\f100"}.ion-android-add:before{content:"\f2c7"}.ion-android-add-circle:before{content:"\f359"}.ion-android-alarm-clock:before{content:"\f35a"}.ion-android-alert:before{content:"\f35b"}.ion-android-apps:before{content:"\f35c"}.ion-android-archive:before{content:"\f2c9"}.ion-android-arrow-back:before{content:"\f2ca"}.ion-android-arrow-down:before{content:"\f35d"}.ion-android-arrow-dropdown:before{content:"\f35f"}.ion-android-arrow-dropdown-circle:before{content:"\f35e"}.ion-android-arrow-dropleft:before{content:"\f361"}.ion-android-arrow-dropleft-circle:before{content:"\f360"}.ion-android-arrow-dropright:before{content:"\f363"}.ion-android-arrow-dropright-circle:before{content:"\f362"}.ion-android-arrow-dropup:before{content:"\f365"}.ion-android-arrow-dropup-circle:before{content:"\f364"}.ion-android-arrow-forward:before{content:"\f30f"}.ion-android-arrow-up:before{content:"\f366"}.ion-android-attach:before{content:"\f367"}.ion-android-bar:before{content:"\f368"}.ion-android-bicycle:before{content:"\f369"}.ion-android-boat:before{content:"\f36a"}.ion-android-bookmark:before{content:"\f36b"}.ion-android-bulb:before{content:"\f36c"}.ion-android-bus:before{content:"\f36d"}.ion-android-calendar:before{content:"\f2d1"}.ion-android-call:before{content:"\f2d2"}.ion-android-camera:before{content:"\f2d3"}.ion-android-cancel:before{content:"\f36e"}.ion-android-car:before{content:"\f36f"}.ion-android-cart:before{content:"\f370"}.ion-android-chat:before{content:"\f2d4"}.ion-android-checkbox:before{content:"\f374"}.ion-android-checkbox-blank:before{content:"\f371"}.ion-android-checkbox-outline:before{content:"\f373"}.ion-android-checkbox-outline-blank:before{content:"\f372"}.ion-android-checkmark-circle:before{content:"\f375"}.ion-android-clipboard:before{content:"\f376"}.ion-android-close:before{content:"\f2d7"}.ion-android-cloud:before{content:"\f37a"}.ion-android-cloud-circle:before{content:"\f377"}.ion-android-cloud-done:before{content:"\f378"}.ion-android-cloud-outline:before{content:"\f379"}.ion-android-color-palette:before{content:"\f37b"}.ion-android-compass:before{content:"\f37c"}.ion-android-contact:before{content:"\f2d8"}.ion-android-contacts:before{content:"\f2d9"}.ion-android-contract:before{content:"\f37d"}.ion-android-create:before{content:"\f37e"}.ion-android-delete:before{content:"\f37f"}.ion-android-desktop:before{content:"\f380"}.ion-android-document:before{content:"\f381"}.ion-android-done:before{content:"\f383"}.ion-android-done-all:before{content:"\f382"}.ion-android-download:before{content:"\f2dd"}.ion-android-drafts:before{content:"\f384"}.ion-android-exit:before{content:"\f385"}.ion-android-expand:before{content:"\f386"}.ion-android-favorite:before{content:"\f388"}.ion-android-favorite-outline:before{content:"\f387"}.ion-android-film:before{content:"\f389"}.ion-android-folder:before{content:"\f2e0"}.ion-android-folder-open:before{content:"\f38a"}.ion-android-funnel:before{content:"\f38b"}.ion-android-globe:before{content:"\f38c"}.ion-android-hand:before{content:"\f2e3"}.ion-android-hangout:before{content:"\f38d"}.ion-android-happy:before{content:"\f38e"}.ion-android-home:before{content:"\f38f"}.ion-android-image:before{content:"\f2e4"}.ion-android-laptop:before{content:"\f390"}.ion-android-list:before{content:"\f391"}.ion-android-locate:before{content:"\f2e9"}.ion-android-lock:before{content:"\f392"}.ion-android-mail:before{content:"\f2eb"}.ion-android-map:before{content:"\f393"}.ion-android-menu:before{content:"\f394"}.ion-android-microphone:before{content:"\f2ec"}.ion-android-microphone-off:before{content:"\f395"}.ion-android-more-horizontal:before{content:"\f396"}.ion-android-more-vertical:before{content:"\f397"}.ion-android-navigate:before{content:"\f398"}.ion-android-notifications:before{content:"\f39b"}.ion-android-notifications-none:before{content:"\f399"}.ion-android-notifications-off:before{content:"\f39a"}.ion-android-open:before{content:"\f39c"}.ion-android-options:before{content:"\f39d"}.ion-android-people:before{content:"\f39e"}.ion-android-person:before{content:"\f3a0"}.ion-android-person-add:before{content:"\f39f"}.ion-android-phone-landscape:before{content:"\f3a1"}.ion-android-phone-portrait:before{content:"\f3a2"}.ion-android-pin:before{content:"\f3a3"}.ion-android-plane:before{content:"\f3a4"}.ion-android-playstore:before{content:"\f2f0"}.ion-android-print:before{content:"\f3a5"}.ion-android-radio-button-off:before{content:"\f3a6"}.ion-android-radio-button-on:before{content:"\f3a7"}.ion-android-refresh:before{content:"\f3a8"}.ion-android-remove:before{content:"\f2f4"}.ion-android-remove-circle:before{content:"\f3a9"}.ion-android-restaurant:before{content:"\f3aa"}.ion-android-sad:before{content:"\f3ab"}.ion-android-search:before{content:"\f2f5"}.ion-android-send:before{content:"\f2f6"}.ion-android-settings:before{content:"\f2f7"}.ion-android-share:before{content:"\f2f8"}.ion-android-share-alt:before{content:"\f3ac"}.ion-android-star:before{content:"\f2fc"}.ion-android-star-half:before{content:"\f3ad"}.ion-android-star-outline:before{content:"\f3ae"}.ion-android-stopwatch:before{content:"\f2fd"}.ion-android-subway:before{content:"\f3af"}.ion-android-sunny:before{content:"\f3b0"}.ion-android-sync:before{content:"\f3b1"}.ion-android-textsms:before{content:"\f3b2"}.ion-android-time:before{content:"\f3b3"}.ion-android-train:before{content:"\f3b4"}.ion-android-unlock:before{content:"\f3b5"}.ion-android-upload:before{content:"\f3b6"}.ion-android-volume-down:before{content:"\f3b7"}.ion-android-volume-mute:before{content:"\f3b8"}.ion-android-volume-off:before{content:"\f3b9"}.ion-android-volume-up:before{content:"\f3ba"}.ion-android-walk:before{content:"\f3bb"}.ion-android-warning:before{content:"\f3bc"}.ion-android-watch:before{content:"\f3bd"}.ion-android-wifi:before{content:"\f305"}.ion-aperture:before{content:"\f313"}.ion-archive:before{content:"\f102"}.ion-arrow-down-a:before{content:"\f103"}.ion-arrow-down-b:before{content:"\f104"}.ion-arrow-down-c:before{content:"\f105"}.ion-arrow-expand:before{content:"\f25e"}.ion-arrow-graph-down-left:before{content:"\f25f"}.ion-arrow-graph-down-right:before{content:"\f260"}.ion-arrow-graph-up-left:before{content:"\f261"}.ion-arrow-graph-up-right:before{content:"\f262"}.ion-arrow-left-a:before{content:"\f106"}.ion-arrow-left-b:before{content:"\f107"}.ion-arrow-left-c:before{content:"\f108"}.ion-arrow-move:before{content:"\f263"}.ion-arrow-resize:before{content:"\f264"}.ion-arrow-return-left:before{content:"\f265"}.ion-arrow-return-right:before{content:"\f266"}.ion-arrow-right-a:before{content:"\f109"}.ion-arrow-right-b:before{content:"\f10a"}.ion-arrow-right-c:before{content:"\f10b"}.ion-arrow-shrink:before{content:"\f267"}.ion-arrow-swap:before{content:"\f268"}.ion-arrow-up-a:before{content:"\f10c"}.ion-arrow-up-b:before{content:"\f10d"}.ion-arrow-up-c:before{content:"\f10e"}.ion-asterisk:before{content:"\f314"}.ion-at:before{content:"\f10f"}.ion-backspace:before{content:"\f3bf"}.ion-backspace-outline:before{content:"\f3be"}.ion-bag:before{content:"\f110"}.ion-battery-charging:before{content:"\f111"}.ion-battery-empty:before{content:"\f112"}.ion-battery-full:before{content:"\f113"}.ion-battery-half:before{content:"\f114"}.ion-battery-low:before{content:"\f115"}.ion-beaker:before{content:"\f269"}.ion-beer:before{content:"\f26a"}.ion-bluetooth:before{content:"\f116"}.ion-bonfire:before{content:"\f315"}.ion-bookmark:before{content:"\f26b"}.ion-bowtie:before{content:"\f3c0"}.ion-briefcase:before{content:"\f26c"}.ion-bug:before{content:"\f2be"}.ion-calculator:before{content:"\f26d"}.ion-calendar:before{content:"\f117"}.ion-camera:before{content:"\f118"}.ion-card:before{content:"\f119"}.ion-cash:before{content:"\f316"}.ion-chatbox:before{content:"\f11b"}.ion-chatbox-working:before{content:"\f11a"}.ion-chatboxes:before{content:"\f11c"}.ion-chatbubble:before{content:"\f11e"}.ion-chatbubble-working:before{content:"\f11d"}.ion-chatbubbles:before{content:"\f11f"}.ion-checkmark:before{content:"\f122"}.ion-checkmark-circled:before{content:"\f120"}.ion-checkmark-round:before{content:"\f121"}.ion-chevron-down:before{content:"\f123"}.ion-chevron-left:before{content:"\f124"}.ion-chevron-right:before{content:"\f125"}.ion-chevron-up:before{content:"\f126"}.ion-clipboard:before{content:"\f127"}.ion-clock:before{content:"\f26e"}.ion-close:before{content:"\f12a"}.ion-close-circled:before{content:"\f128"}.ion-close-round:before{content:"\f129"}.ion-closed-captioning:before{content:"\f317"}.ion-cloud:before{content:"\f12b"}.ion-code:before{content:"\f271"}.ion-code-download:before{content:"\f26f"}.ion-code-working:before{content:"\f270"}.ion-coffee:before{content:"\f272"}.ion-compass:before{content:"\f273"}.ion-compose:before{content:"\f12c"}.ion-connection-bars:before{content:"\f274"}.ion-contrast:before{content:"\f275"}.ion-crop:before{content:"\f3c1"}.ion-cube:before{content:"\f318"}.ion-disc:before{content:"\f12d"}.ion-document:before{content:"\f12f"}.ion-document-text:before{content:"\f12e"}.ion-drag:before{content:"\f130"}.ion-earth:before{content:"\f276"}.ion-easel:before{content:"\f3c2"}.ion-edit:before{content:"\f2bf"}.ion-egg:before{content:"\f277"}.ion-eject:before{content:"\f131"}.ion-email:before{content:"\f132"}.ion-email-unread:before{content:"\f3c3"}.ion-erlenmeyer-flask:before{content:"\f3c5"}.ion-erlenmeyer-flask-bubbles:before{content:"\f3c4"}.ion-eye:before{content:"\f133"}.ion-eye-disabled:before{content:"\f306"}.ion-female:before{content:"\f278"}.ion-filing:before{content:"\f134"}.ion-film-marker:before{content:"\f135"}.ion-fireball:before{content:"\f319"}.ion-flag:before{content:"\f279"}.ion-flame:before{content:"\f31a"}.ion-flash:before{content:"\f137"}.ion-flash-off:before{content:"\f136"}.ion-folder:before{content:"\f139"}.ion-fork:before{content:"\f27a"}.ion-fork-repo:before{content:"\f2c0"}.ion-forward:before{content:"\f13a"}.ion-funnel:before{content:"\f31b"}.ion-gear-a:before{content:"\f13d"}.ion-gear-b:before{content:"\f13e"}.ion-grid:before{content:"\f13f"}.ion-hammer:before{content:"\f27b"}.ion-happy:before{content:"\f31c"}.ion-happy-outline:before{content:"\f3c6"}.ion-headphone:before{content:"\f140"}.ion-heart:before{content:"\f141"}.ion-heart-broken:before{content:"\f31d"}.ion-help:before{content:"\f143"}.ion-help-buoy:before{content:"\f27c"}.ion-help-circled:before{content:"\f142"}.ion-home:before{content:"\f144"}.ion-icecream:before{content:"\f27d"}.ion-image:before{content:"\f147"}.ion-images:before{content:"\f148"}.ion-information:before{content:"\f14a"}.ion-information-circled:before{content:"\f149"}.ion-ionic:before{content:"\f14b"}.ion-ios-alarm:before{content:"\f3c8"}.ion-ios-alarm-outline:before{content:"\f3c7"}.ion-ios-albums:before{content:"\f3ca"}.ion-ios-albums-outline:before{content:"\f3c9"}.ion-ios-americanfootball:before{content:"\f3cc"}.ion-ios-americanfootball-outline:before{content:"\f3cb"}.ion-ios-analytics:before{content:"\f3ce"}.ion-ios-analytics-outline:before{content:"\f3cd"}.ion-ios-arrow-back:before{content:"\f3cf"}.ion-ios-arrow-down:before{content:"\f3d0"}.ion-ios-arrow-forward:before{content:"\f3d1"}.ion-ios-arrow-left:before{content:"\f3d2"}.ion-ios-arrow-right:before{content:"\f3d3"}.ion-ios-arrow-thin-down:before{content:"\f3d4"}.ion-ios-arrow-thin-left:before{content:"\f3d5"}.ion-ios-arrow-thin-right:before{content:"\f3d6"}.ion-ios-arrow-thin-up:before{content:"\f3d7"}.ion-ios-arrow-up:before{content:"\f3d8"}.ion-ios-at:before{content:"\f3da"}.ion-ios-at-outline:before{content:"\f3d9"}.ion-ios-barcode:before{content:"\f3dc"}.ion-ios-barcode-outline:before{content:"\f3db"}.ion-ios-baseball:before{content:"\f3de"}.ion-ios-baseball-outline:before{content:"\f3dd"}.ion-ios-basketball:before{content:"\f3e0"}.ion-ios-basketball-outline:before{content:"\f3df"}.ion-ios-bell:before{content:"\f3e2"}.ion-ios-bell-outline:before{content:"\f3e1"}.ion-ios-body:before{content:"\f3e4"}.ion-ios-body-outline:before{content:"\f3e3"}.ion-ios-bolt:before{content:"\f3e6"}.ion-ios-bolt-outline:before{content:"\f3e5"}.ion-ios-book:before{content:"\f3e8"}.ion-ios-book-outline:before{content:"\f3e7"}.ion-ios-bookmarks:before{content:"\f3ea"}.ion-ios-bookmarks-outline:before{content:"\f3e9"}.ion-ios-box:before{content:"\f3ec"}.ion-ios-box-outline:before{content:"\f3eb"}.ion-ios-briefcase:before{content:"\f3ee"}.ion-ios-briefcase-outline:before{content:"\f3ed"}.ion-ios-browsers:before{content:"\f3f0"}.ion-ios-browsers-outline:before{content:"\f3ef"}.ion-ios-calculator:before{content:"\f3f2"}.ion-ios-calculator-outline:before{content:"\f3f1"}.ion-ios-calendar:before{content:"\f3f4"}.ion-ios-calendar-outline:before{content:"\f3f3"}.ion-ios-camera:before{content:"\f3f6"}.ion-ios-camera-outline:before{content:"\f3f5"}.ion-ios-cart:before{content:"\f3f8"}.ion-ios-cart-outline:before{content:"\f3f7"}.ion-ios-chatboxes:before{content:"\f3fa"}.ion-ios-chatboxes-outline:before{content:"\f3f9"}.ion-ios-chatbubble:before{content:"\f3fc"}.ion-ios-chatbubble-outline:before{content:"\f3fb"}.ion-ios-checkmark:before{content:"\f3ff"}.ion-ios-checkmark-empty:before{content:"\f3fd"}.ion-ios-checkmark-outline:before{content:"\f3fe"}.ion-ios-circle-filled:before{content:"\f400"}.ion-ios-circle-outline:before{content:"\f401"}.ion-ios-clock:before{content:"\f403"}.ion-ios-clock-outline:before{content:"\f402"}.ion-ios-close:before{content:"\f406"}.ion-ios-close-empty:before{content:"\f404"}.ion-ios-close-outline:before{content:"\f405"}.ion-ios-cloud:before{content:"\f40c"}.ion-ios-cloud-download:before{content:"\f408"}.ion-ios-cloud-download-outline:before{content:"\f407"}.ion-ios-cloud-outline:before{content:"\f409"}.ion-ios-cloud-upload:before{content:"\f40b"}.ion-ios-cloud-upload-outline:before{content:"\f40a"}.ion-ios-cloudy:before{content:"\f410"}.ion-ios-cloudy-night:before{content:"\f40e"}.ion-ios-cloudy-night-outline:before{content:"\f40d"}.ion-ios-cloudy-outline:before{content:"\f40f"}.ion-ios-cog:before{content:"\f412"}.ion-ios-cog-outline:before{content:"\f411"}.ion-ios-color-filter:before{content:"\f414"}.ion-ios-color-filter-outline:before{content:"\f413"}.ion-ios-color-wand:before{content:"\f416"}.ion-ios-color-wand-outline:before{content:"\f415"}.ion-ios-compose:before{content:"\f418"}.ion-ios-compose-outline:before{content:"\f417"}.ion-ios-contact:before{content:"\f41a"}.ion-ios-contact-outline:before{content:"\f419"}.ion-ios-copy:before{content:"\f41c"}.ion-ios-copy-outline:before{content:"\f41b"}.ion-ios-crop:before{content:"\f41e"}.ion-ios-crop-strong:before{content:"\f41d"}.ion-ios-download:before{content:"\f420"}.ion-ios-download-outline:before{content:"\f41f"}.ion-ios-drag:before{content:"\f421"}.ion-ios-email:before{content:"\f423"}.ion-ios-email-outline:before{content:"\f422"}.ion-ios-eye:before{content:"\f425"}.ion-ios-eye-outline:before{content:"\f424"}.ion-ios-fastforward:before{content:"\f427"}.ion-ios-fastforward-outline:before{content:"\f426"}.ion-ios-filing:before{content:"\f429"}.ion-ios-filing-outline:before{content:"\f428"}.ion-ios-film:before{content:"\f42b"}.ion-ios-film-outline:before{content:"\f42a"}.ion-ios-flag:before{content:"\f42d"}.ion-ios-flag-outline:before{content:"\f42c"}.ion-ios-flame:before{content:"\f42f"}.ion-ios-flame-outline:before{content:"\f42e"}.ion-ios-flask:before{content:"\f431"}.ion-ios-flask-outline:before{content:"\f430"}.ion-ios-flower:before{content:"\f433"}.ion-ios-flower-outline:before{content:"\f432"}.ion-ios-folder:before{content:"\f435"}.ion-ios-folder-outline:before{content:"\f434"}.ion-ios-football:before{content:"\f437"}.ion-ios-football-outline:before{content:"\f436"}.ion-ios-game-controller-a:before{content:"\f439"}.ion-ios-game-controller-a-outline:before{content:"\f438"}.ion-ios-game-controller-b:before{content:"\f43b"}.ion-ios-game-controller-b-outline:before{content:"\f43a"}.ion-ios-gear:before{content:"\f43d"}.ion-ios-gear-outline:before{content:"\f43c"}.ion-ios-glasses:before{content:"\f43f"}.ion-ios-glasses-outline:before{content:"\f43e"}.ion-ios-grid-view:before{content:"\f441"}.ion-ios-grid-view-outline:before{content:"\f440"}.ion-ios-heart:before{content:"\f443"}.ion-ios-heart-outline:before{content:"\f442"}.ion-ios-help:before{content:"\f446"}.ion-ios-help-empty:before{content:"\f444"}.ion-ios-help-outline:before{content:"\f445"}.ion-ios-home:before{content:"\f448"}.ion-ios-home-outline:before{content:"\f447"}.ion-ios-infinite:before{content:"\f44a"}.ion-ios-infinite-outline:before{content:"\f449"}.ion-ios-information:before{content:"\f44d"}.ion-ios-information-empty:before{content:"\f44b"}.ion-ios-information-outline:before{content:"\f44c"}.ion-ios-ionic-outline:before{content:"\f44e"}.ion-ios-keypad:before{content:"\f450"}.ion-ios-keypad-outline:before{content:"\f44f"}.ion-ios-lightbulb:before{content:"\f452"}.ion-ios-lightbulb-outline:before{content:"\f451"}.ion-ios-list:before{content:"\f454"}.ion-ios-list-outline:before{content:"\f453"}.ion-ios-location:before{content:"\f456"}.ion-ios-location-outline:before{content:"\f455"}.ion-ios-locked:before{content:"\f458"}.ion-ios-locked-outline:before{content:"\f457"}.ion-ios-loop:before{content:"\f45a"}.ion-ios-loop-strong:before{content:"\f459"}.ion-ios-medical:before{content:"\f45c"}.ion-ios-medical-outline:before{content:"\f45b"}.ion-ios-medkit:before{content:"\f45e"}.ion-ios-medkit-outline:before{content:"\f45d"}.ion-ios-mic:before{content:"\f461"}.ion-ios-mic-off:before{content:"\f45f"}.ion-ios-mic-outline:before{content:"\f460"}.ion-ios-minus:before{content:"\f464"}.ion-ios-minus-empty:before{content:"\f462"}.ion-ios-minus-outline:before{content:"\f463"}.ion-ios-monitor:before{content:"\f466"}.ion-ios-monitor-outline:before{content:"\f465"}.ion-ios-moon:before{content:"\f468"}.ion-ios-moon-outline:before{content:"\f467"}.ion-ios-more:before{content:"\f46a"}.ion-ios-more-outline:before{content:"\f469"}.ion-ios-musical-note:before{content:"\f46b"}.ion-ios-musical-notes:before{content:"\f46c"}.ion-ios-navigate:before{content:"\f46e"}.ion-ios-navigate-outline:before{content:"\f46d"}.ion-ios-nutrition:before{content:"\f470"}.ion-ios-nutrition-outline:before{content:"\f46f"}.ion-ios-paper:before{content:"\f472"}.ion-ios-paper-outline:before{content:"\f471"}.ion-ios-paperplane:before{content:"\f474"}.ion-ios-paperplane-outline:before{content:"\f473"}.ion-ios-partlysunny:before{content:"\f476"}.ion-ios-partlysunny-outline:before{content:"\f475"}.ion-ios-pause:before{content:"\f478"}.ion-ios-pause-outline:before{content:"\f477"}.ion-ios-paw:before{content:"\f47a"}.ion-ios-paw-outline:before{content:"\f479"}.ion-ios-people:before{content:"\f47c"}.ion-ios-people-outline:before{content:"\f47b"}.ion-ios-person:before{content:"\f47e"}.ion-ios-person-outline:before{content:"\f47d"}.ion-ios-personadd:before{content:"\f480"}.ion-ios-personadd-outline:before{content:"\f47f"}.ion-ios-photos:before{content:"\f482"}.ion-ios-photos-outline:before{content:"\f481"}.ion-ios-pie:before{content:"\f484"}.ion-ios-pie-outline:before{content:"\f483"}.ion-ios-pint:before{content:"\f486"}.ion-ios-pint-outline:before{content:"\f485"}.ion-ios-play:before{content:"\f488"}.ion-ios-play-outline:before{content:"\f487"}.ion-ios-plus:before{content:"\f48b"}.ion-ios-plus-empty:before{content:"\f489"}.ion-ios-plus-outline:before{content:"\f48a"}.ion-ios-pricetag:before{content:"\f48d"}.ion-ios-pricetag-outline:before{content:"\f48c"}.ion-ios-pricetags:before{content:"\f48f"}.ion-ios-pricetags-outline:before{content:"\f48e"}.ion-ios-printer:before{content:"\f491"}.ion-ios-printer-outline:before{content:"\f490"}.ion-ios-pulse:before{content:"\f493"}.ion-ios-pulse-strong:before{content:"\f492"}.ion-ios-rainy:before{content:"\f495"}.ion-ios-rainy-outline:before{content:"\f494"}.ion-ios-recording:before{content:"\f497"}.ion-ios-recording-outline:before{content:"\f496"}.ion-ios-redo:before{content:"\f499"}.ion-ios-redo-outline:before{content:"\f498"}.ion-ios-refresh:before{content:"\f49c"}.ion-ios-refresh-empty:before{content:"\f49a"}.ion-ios-refresh-outline:before{content:"\f49b"}.ion-ios-reload:before{content:"\f49d"}.ion-ios-reverse-camera:before{content:"\f49f"}.ion-ios-reverse-camera-outline:before{content:"\f49e"}.ion-ios-rewind:before{content:"\f4a1"}.ion-ios-rewind-outline:before{content:"\f4a0"}.ion-ios-rose:before{content:"\f4a3"}.ion-ios-rose-outline:before{content:"\f4a2"}.ion-ios-search:before{content:"\f4a5"}.ion-ios-search-strong:before{content:"\f4a4"}.ion-ios-settings:before{content:"\f4a7"}.ion-ios-settings-strong:before{content:"\f4a6"}.ion-ios-shuffle:before{content:"\f4a9"}.ion-ios-shuffle-strong:before{content:"\f4a8"}.ion-ios-skipbackward:before{content:"\f4ab"}.ion-ios-skipbackward-outline:before{content:"\f4aa"}.ion-ios-skipforward:before{content:"\f4ad"}.ion-ios-skipforward-outline:before{content:"\f4ac"}.ion-ios-snowy:before{content:"\f4ae"}.ion-ios-speedometer:before{content:"\f4b0"}.ion-ios-speedometer-outline:before{content:"\f4af"}.ion-ios-star:before{content:"\f4b3"}.ion-ios-star-half:before{content:"\f4b1"}.ion-ios-star-outline:before{content:"\f4b2"}.ion-ios-stopwatch:before{content:"\f4b5"}.ion-ios-stopwatch-outline:before{content:"\f4b4"}.ion-ios-sunny:before{content:"\f4b7"}.ion-ios-sunny-outline:before{content:"\f4b6"}.ion-ios-telephone:before{content:"\f4b9"}.ion-ios-telephone-outline:before{content:"\f4b8"}.ion-ios-tennisball:before{content:"\f4bb"}.ion-ios-tennisball-outline:before{content:"\f4ba"}.ion-ios-thunderstorm:before{content:"\f4bd"}.ion-ios-thunderstorm-outline:before{content:"\f4bc"}.ion-ios-time:before{content:"\f4bf"}.ion-ios-time-outline:before{content:"\f4be"}.ion-ios-timer:before{content:"\f4c1"}.ion-ios-timer-outline:before{content:"\f4c0"}.ion-ios-toggle:before{content:"\f4c3"}.ion-ios-toggle-outline:before{content:"\f4c2"}.ion-ios-trash:before{content:"\f4c5"}.ion-ios-trash-outline:before{content:"\f4c4"}.ion-ios-undo:before{content:"\f4c7"}.ion-ios-undo-outline:before{content:"\f4c6"}.ion-ios-unlocked:before{content:"\f4c9"}.ion-ios-unlocked-outline:before{content:"\f4c8"}.ion-ios-upload:before{content:"\f4cb"}.ion-ios-upload-outline:before{content:"\f4ca"}.ion-ios-videocam:before{content:"\f4cd"}.ion-ios-videocam-outline:before{content:"\f4cc"}.ion-ios-volume-high:before{content:"\f4ce"}.ion-ios-volume-low:before{content:"\f4cf"}.ion-ios-wineglass:before{content:"\f4d1"}.ion-ios-wineglass-outline:before{content:"\f4d0"}.ion-ios-world:before{content:"\f4d3"}.ion-ios-world-outline:before{content:"\f4d2"}.ion-ipad:before{content:"\f1f9"}.ion-iphone:before{content:"\f1fa"}.ion-ipod:before{content:"\f1fb"}.ion-jet:before{content:"\f295"}.ion-key:before{content:"\f296"}.ion-knife:before{content:"\f297"}.ion-laptop:before{content:"\f1fc"}.ion-leaf:before{content:"\f1fd"}.ion-levels:before{content:"\f298"}.ion-lightbulb:before{content:"\f299"}.ion-link:before{content:"\f1fe"}.ion-load-a:before{content:"\f29a"}.ion-load-b:before{content:"\f29b"}.ion-load-c:before{content:"\f29c"}.ion-load-d:before{content:"\f29d"}.ion-location:before{content:"\f1ff"}.ion-lock-combination:before{content:"\f4d4"}.ion-locked:before{content:"\f200"}.ion-log-in:before{content:"\f29e"}.ion-log-out:before{content:"\f29f"}.ion-loop:before{content:"\f201"}.ion-magnet:before{content:"\f2a0"}.ion-male:before{content:"\f2a1"}.ion-man:before{content:"\f202"}.ion-map:before{content:"\f203"}.ion-medkit:before{content:"\f2a2"}.ion-merge:before{content:"\f33f"}.ion-mic-a:before{content:"\f204"}.ion-mic-b:before{content:"\f205"}.ion-mic-c:before{content:"\f206"}.ion-minus:before{content:"\f209"}.ion-minus-circled:before{content:"\f207"}.ion-minus-round:before{content:"\f208"}.ion-model-s:before{content:"\f2c1"}.ion-monitor:before{content:"\f20a"}.ion-more:before{content:"\f20b"}.ion-mouse:before{content:"\f340"}.ion-music-note:before{content:"\f20c"}.ion-navicon:before{content:"\f20e"}.ion-navicon-round:before{content:"\f20d"}.ion-navigate:before{content:"\f2a3"}.ion-network:before{content:"\f341"}.ion-no-smoking:before{content:"\f2c2"}.ion-nuclear:before{content:"\f2a4"}.ion-outlet:before{content:"\f342"}.ion-paintbrush:before{content:"\f4d5"}.ion-paintbucket:before{content:"\f4d6"}.ion-paper-airplane:before{content:"\f2c3"}.ion-paperclip:before{content:"\f20f"}.ion-pause:before{content:"\f210"}.ion-person:before{content:"\f213"}.ion-person-add:before{content:"\f211"}.ion-person-stalker:before{content:"\f212"}.ion-pie-graph:before{content:"\f2a5"}.ion-pin:before{content:"\f2a6"}.ion-pinpoint:before{content:"\f2a7"}.ion-pizza:before{content:"\f2a8"}.ion-plane:before{content:"\f214"}.ion-planet:before{content:"\f343"}.ion-play:before{content:"\f215"}.ion-playstation:before{content:"\f30a"}.ion-plus:before{content:"\f218"}.ion-plus-circled:before{content:"\f216"}.ion-plus-round:before{content:"\f217"}.ion-podium:before{content:"\f344"}.ion-pound:before{content:"\f219"}.ion-power:before{content:"\f2a9"}.ion-pricetag:before{content:"\f2aa"}.ion-pricetags:before{content:"\f2ab"}.ion-printer:before{content:"\f21a"}.ion-pull-request:before{content:"\f345"}.ion-qr-scanner:before{content:"\f346"}.ion-quote:before{content:"\f347"}.ion-radio-waves:before{content:"\f2ac"}.ion-record:before{content:"\f21b"}.ion-refresh:before{content:"\f21c"}.ion-reply:before{content:"\f21e"}.ion-reply-all:before{content:"\f21d"}.ion-ribbon-a:before{content:"\f348"}.ion-ribbon-b:before{content:"\f349"}.ion-sad:before{content:"\f34a"}.ion-sad-outline:before{content:"\f4d7"}.ion-scissors:before{content:"\f34b"}.ion-search:before{content:"\f21f"}.ion-settings:before{content:"\f2ad"}.ion-share:before{content:"\f220"}.ion-shuffle:before{content:"\f221"}.ion-skip-backward:before{content:"\f222"}.ion-skip-forward:before{content:"\f223"}.ion-social-android:before{content:"\f225"}.ion-social-android-outline:before{content:"\f224"}.ion-social-angular:before{content:"\f4d9"}.ion-social-angular-outline:before{content:"\f4d8"}.ion-social-apple:before{content:"\f227"}.ion-social-apple-outline:before{content:"\f226"}.ion-social-bitcoin:before{content:"\f2af"}.ion-social-bitcoin-outline:before{content:"\f2ae"}.ion-social-buffer:before{content:"\f229"}.ion-social-buffer-outline:before{content:"\f228"}.ion-social-chrome:before{content:"\f4db"}.ion-social-chrome-outline:before{content:"\f4da"}.ion-social-codepen:before{content:"\f4dd"}.ion-social-codepen-outline:before{content:"\f4dc"}.ion-social-css3:before{content:"\f4df"}.ion-social-css3-outline:before{content:"\f4de"}.ion-social-designernews:before{content:"\f22b"}.ion-social-designernews-outline:before{content:"\f22a"}.ion-social-dribbble:before{content:"\f22d"}.ion-social-dribbble-outline:before{content:"\f22c"}.ion-social-dropbox:before{content:"\f22f"}.ion-social-dropbox-outline:before{content:"\f22e"}.ion-social-euro:before{content:"\f4e1"}.ion-social-euro-outline:before{content:"\f4e0"}.ion-social-facebook:before{content:"\f231"}.ion-social-facebook-outline:before{content:"\f230"}.ion-social-foursquare:before{content:"\f34d"}.ion-social-foursquare-outline:before{content:"\f34c"}.ion-social-freebsd-devil:before{content:"\f2c4"}.ion-social-github:before{content:"\f233"}.ion-social-github-outline:before{content:"\f232"}.ion-social-google:before{content:"\f34f"}.ion-social-google-outline:before{content:"\f34e"}.ion-social-googleplus:before{content:"\f235"}.ion-social-googleplus-outline:before{content:"\f234"}.ion-social-hackernews:before{content:"\f237"}.ion-social-hackernews-outline:before{content:"\f236"}.ion-social-html5:before{content:"\f4e3"}.ion-social-html5-outline:before{content:"\f4e2"}.ion-social-instagram:before{content:"\f351"}.ion-social-instagram-outline:before{content:"\f350"}.ion-social-javascript:before{content:"\f4e5"}.ion-social-javascript-outline:before{content:"\f4e4"}.ion-social-linkedin:before{content:"\f239"}.ion-social-linkedin-outline:before{content:"\f238"}.ion-social-markdown:before{content:"\f4e6"}.ion-social-nodejs:before{content:"\f4e7"}.ion-social-octocat:before{content:"\f4e8"}.ion-social-pinterest:before{content:"\f2b1"}.ion-social-pinterest-outline:before{content:"\f2b0"}.ion-social-python:before{content:"\f4e9"}.ion-social-reddit:before{content:"\f23b"}.ion-social-reddit-outline:before{content:"\f23a"}.ion-social-rss:before{content:"\f23d"}.ion-social-rss-outline:before{content:"\f23c"}.ion-social-sass:before{content:"\f4ea"}.ion-social-skype:before{content:"\f23f"}.ion-social-skype-outline:before{content:"\f23e"}.ion-social-snapchat:before{content:"\f4ec"}.ion-social-snapchat-outline:before{content:"\f4eb"}.ion-social-tumblr:before{content:"\f241"}.ion-social-tumblr-outline:before{content:"\f240"}.ion-social-tux:before{content:"\f2c5"}.ion-social-twitch:before{content:"\f4ee"}.ion-social-twitch-outline:before{content:"\f4ed"}.ion-social-twitter:before{content:"\f243"}.ion-social-twitter-outline:before{content:"\f242"}.ion-social-usd:before{content:"\f353"}.ion-social-usd-outline:before{content:"\f352"}.ion-social-vimeo:before{content:"\f245"}.ion-social-vimeo-outline:before{content:"\f244"}.ion-social-whatsapp:before{content:"\f4f0"}.ion-social-whatsapp-outline:before{content:"\f4ef"}.ion-social-windows:before{content:"\f247"}.ion-social-windows-outline:before{content:"\f246"}.ion-social-wordpress:before{content:"\f249"}.ion-social-wordpress-outline:before{content:"\f248"}.ion-social-yahoo:before{content:"\f24b"}.ion-social-yahoo-outline:before{content:"\f24a"}.ion-social-yen:before{content:"\f4f2"}.ion-social-yen-outline:before{content:"\f4f1"}.ion-social-youtube:before{content:"\f24d"}.ion-social-youtube-outline:before{content:"\f24c"}.ion-soup-can:before{content:"\f4f4"}.ion-soup-can-outline:before{content:"\f4f3"}.ion-speakerphone:before{content:"\f2b2"}.ion-speedometer:before{content:"\f2b3"}.ion-spoon:before{content:"\f2b4"}.ion-star:before{content:"\f24e"}.ion-stats-bars:before{content:"\f2b5"}.ion-steam:before{content:"\f30b"}.ion-stop:before{content:"\f24f"}.ion-thermometer:before{content:"\f2b6"}.ion-thumbsdown:before{content:"\f250"}.ion-thumbsup:before{content:"\f251"}.ion-toggle:before{content:"\f355"}.ion-toggle-filled:before{content:"\f354"}.ion-transgender:before{content:"\f4f5"}.ion-trash-a:before{content:"\f252"}.ion-trash-b:before{content:"\f253"}.ion-trophy:before{content:"\f356"}.ion-tshirt:before{content:"\f4f7"}.ion-tshirt-outline:before{content:"\f4f6"}.ion-umbrella:before{content:"\f2b7"}.ion-university:before{content:"\f357"}.ion-unlocked:before{content:"\f254"}.ion-upload:before{content:"\f255"}.ion-usb:before{content:"\f2b8"}.ion-videocamera:before{content:"\f256"}.ion-volume-high:before{content:"\f257"}.ion-volume-low:before{content:"\f258"}.ion-volume-medium:before{content:"\f259"}.ion-volume-mute:before{content:"\f25a"}.ion-wand:before{content:"\f358"}.ion-waterdrop:before{content:"\f25b"}.ion-wifi:before{content:"\f25c"}.ion-wineglass:before{content:"\f2b9"}.ion-woman:before{content:"\f25d"}.ion-wrench:before{content:"\f2ba"}.ion-xbox:before{content:"\f30c"} diff --git a/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/index.html b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.eot b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.eot new file mode 100644 index 0000000000000000000000000000000000000000..92a3f20a39267ae7f45144f412a995a663730360 Binary files /dev/null and b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.eot differ diff --git a/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.svg b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.svg new file mode 100644 index 0000000000000000000000000000000000000000..49fc8f367404798ee10aac4f1f2a5b38498fe625 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.svg @@ -0,0 +1,2230 @@ + + + + + +Created by FontForge 20120731 at Thu Dec 4 09:51:48 2014 + By Adam Bradley +Created by Adam Bradley with FontForge 2.0 (http://fontforge.sf.net) + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.ttf b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c4e4632486d863337c1c73478ddb3c20726c55a0 Binary files /dev/null and b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.ttf differ diff --git a/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.woff b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.woff new file mode 100644 index 0000000000000000000000000000000000000000..5f3a14e0a5ca6d20cc4fac708979e807b0d51bc3 Binary files /dev/null and b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/fonts/ionicons.woff differ diff --git a/2_services/1_metaverse/nodam/assets/frameworks/ionicons/index.html b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/ionicons/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/jquery/index.html b/2_services/1_metaverse/nodam/assets/frameworks/jquery/index.html new file mode 100644 index 0000000000000000000000000000000000000000..b702fbc3967b4f49eddb394723822973f2f80fb4 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/jquery/index.html @@ -0,0 +1,11 @@ + + + + 403 Forbidden + + + +

    Directory access is forbidden.

    + + + diff --git a/2_services/1_metaverse/nodam/assets/frameworks/jquery/jquery.min.js b/2_services/1_metaverse/nodam/assets/frameworks/jquery/jquery.min.js new file mode 100644 index 0000000000000000000000000000000000000000..4024b6622b889bb65476341a48a4e5b6485b16b9 --- /dev/null +++ b/2_services/1_metaverse/nodam/assets/frameworks/jquery/jquery.min.js @@ -0,0 +1,4 @@ +/*! jQuery v2.2.4 | (c) jQuery Foundation | jquery.org/license */ +!function(a,b){"object"==typeof module&&"object"==typeof module.exports?module.exports=a.document?b(a,!0):function(a){if(!a.document)throw new Error("jQuery requires a window with a document");return b(a)}:b(a)}("undefined"!=typeof window?window:this,function(a,b){var c=[],d=a.document,e=c.slice,f=c.concat,g=c.push,h=c.indexOf,i={},j=i.toString,k=i.hasOwnProperty,l={},m="2.2.4",n=function(a,b){return new n.fn.init(a,b)},o=/^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,p=/^-ms-/,q=/-([\da-z])/gi,r=function(a,b){return b.toUpperCase()};n.fn=n.prototype={jquery:m,constructor:n,selector:"",length:0,toArray:function(){return e.call(this)},get:function(a){return null!=a?0>a?this[a+this.length]:this[a]:e.call(this)},pushStack:function(a){var b=n.merge(this.constructor(),a);return b.prevObject=this,b.context=this.context,b},each:function(a){return n.each(this,a)},map:function(a){return this.pushStack(n.map(this,function(b,c){return a.call(b,c,b)}))},slice:function(){return this.pushStack(e.apply(this,arguments))},first:function(){return this.eq(0)},last:function(){return this.eq(-1)},eq:function(a){var b=this.length,c=+a+(0>a?b:0);return this.pushStack(c>=0&&b>c?[this[c]]:[])},end:function(){return this.prevObject||this.constructor()},push:g,sort:c.sort,splice:c.splice},n.extend=n.fn.extend=function(){var a,b,c,d,e,f,g=arguments[0]||{},h=1,i=arguments.length,j=!1;for("boolean"==typeof g&&(j=g,g=arguments[h]||{},h++),"object"==typeof g||n.isFunction(g)||(g={}),h===i&&(g=this,h--);i>h;h++)if(null!=(a=arguments[h]))for(b in a)c=g[b],d=a[b],g!==d&&(j&&d&&(n.isPlainObject(d)||(e=n.isArray(d)))?(e?(e=!1,f=c&&n.isArray(c)?c:[]):f=c&&n.isPlainObject(c)?c:{},g[b]=n.extend(j,f,d)):void 0!==d&&(g[b]=d));return g},n.extend({expando:"jQuery"+(m+Math.random()).replace(/\D/g,""),isReady:!0,error:function(a){throw new Error(a)},noop:function(){},isFunction:function(a){return"function"===n.type(a)},isArray:Array.isArray,isWindow:function(a){return null!=a&&a===a.window},isNumeric:function(a){var b=a&&a.toString();return!n.isArray(a)&&b-parseFloat(b)+1>=0},isPlainObject:function(a){var b;if("object"!==n.type(a)||a.nodeType||n.isWindow(a))return!1;if(a.constructor&&!k.call(a,"constructor")&&!k.call(a.constructor.prototype||{},"isPrototypeOf"))return!1;for(b in a);return void 0===b||k.call(a,b)},isEmptyObject:function(a){var b;for(b in a)return!1;return!0},type:function(a){return null==a?a+"":"object"==typeof a||"function"==typeof a?i[j.call(a)]||"object":typeof a},globalEval:function(a){var b,c=eval;a=n.trim(a),a&&(1===a.indexOf("use strict")?(b=d.createElement("script"),b.text=a,d.head.appendChild(b).parentNode.removeChild(b)):c(a))},camelCase:function(a){return a.replace(p,"ms-").replace(q,r)},nodeName:function(a,b){return a.nodeName&&a.nodeName.toLowerCase()===b.toLowerCase()},each:function(a,b){var c,d=0;if(s(a)){for(c=a.length;c>d;d++)if(b.call(a[d],d,a[d])===!1)break}else for(d in a)if(b.call(a[d],d,a[d])===!1)break;return a},trim:function(a){return null==a?"":(a+"").replace(o,"")},makeArray:function(a,b){var c=b||[];return null!=a&&(s(Object(a))?n.merge(c,"string"==typeof a?[a]:a):g.call(c,a)),c},inArray:function(a,b,c){return null==b?-1:h.call(b,a,c)},merge:function(a,b){for(var c=+b.length,d=0,e=a.length;c>d;d++)a[e++]=b[d];return a.length=e,a},grep:function(a,b,c){for(var d,e=[],f=0,g=a.length,h=!c;g>f;f++)d=!b(a[f],f),d!==h&&e.push(a[f]);return e},map:function(a,b,c){var d,e,g=0,h=[];if(s(a))for(d=a.length;d>g;g++)e=b(a[g],g,c),null!=e&&h.push(e);else for(g in a)e=b(a[g],g,c),null!=e&&h.push(e);return f.apply([],h)},guid:1,proxy:function(a,b){var c,d,f;return"string"==typeof b&&(c=a[b],b=a,a=c),n.isFunction(a)?(d=e.call(arguments,2),f=function(){return a.apply(b||this,d.concat(e.call(arguments)))},f.guid=a.guid=a.guid||n.guid++,f):void 0},now:Date.now,support:l}),"function"==typeof Symbol&&(n.fn[Symbol.iterator]=c[Symbol.iterator]),n.each("Boolean Number String Function Array Date RegExp Object Error Symbol".split(" "),function(a,b){i["[object "+b+"]"]=b.toLowerCase()});function s(a){var b=!!a&&"length"in a&&a.length,c=n.type(a);return"function"===c||n.isWindow(a)?!1:"array"===c||0===b||"number"==typeof b&&b>0&&b-1 in a}var t=function(a){var b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u="sizzle"+1*new Date,v=a.document,w=0,x=0,y=ga(),z=ga(),A=ga(),B=function(a,b){return a===b&&(l=!0),0},C=1<<31,D={}.hasOwnProperty,E=[],F=E.pop,G=E.push,H=E.push,I=E.slice,J=function(a,b){for(var c=0,d=a.length;d>c;c++)if(a[c]===b)return c;return-1},K="checked|selected|async|autofocus|autoplay|controls|defer|disabled|hidden|ismap|loop|multiple|open|readonly|required|scoped",L="[\\x20\\t\\r\\n\\f]",M="(?:\\\\.|[\\w-]|[^\\x00-\\xa0])+",N="\\["+L+"*("+M+")(?:"+L+"*([*^$|!~]?=)"+L+"*(?:'((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\"|("+M+"))|)"+L+"*\\]",O=":("+M+")(?:\\((('((?:\\\\.|[^\\\\'])*)'|\"((?:\\\\.|[^\\\\\"])*)\")|((?:\\\\.|[^\\\\()[\\]]|"+N+")*)|.*)\\)|)",P=new RegExp(L+"+","g"),Q=new RegExp("^"+L+"+|((?:^|[^\\\\])(?:\\\\.)*)"+L+"+$","g"),R=new RegExp("^"+L+"*,"+L+"*"),S=new RegExp("^"+L+"*([>+~]|"+L+")"+L+"*"),T=new RegExp("="+L+"*([^\\]'\"]*?)"+L+"*\\]","g"),U=new RegExp(O),V=new RegExp("^"+M+"$"),W={ID:new RegExp("^#("+M+")"),CLASS:new RegExp("^\\.("+M+")"),TAG:new RegExp("^("+M+"|[*])"),ATTR:new RegExp("^"+N),PSEUDO:new RegExp("^"+O),CHILD:new RegExp("^:(only|first|last|nth|nth-last)-(child|of-type)(?:\\("+L+"*(even|odd|(([+-]|)(\\d*)n|)"+L+"*(?:([+-]|)"+L+"*(\\d+)|))"+L+"*\\)|)","i"),bool:new RegExp("^(?:"+K+")$","i"),needsContext:new RegExp("^"+L+"*[>+~]|:(even|odd|eq|gt|lt|nth|first|last)(?:\\("+L+"*((?:-\\d)?\\d*)"+L+"*\\)|)(?=[^-]|$)","i")},X=/^(?:input|select|textarea|button)$/i,Y=/^h\d$/i,Z=/^[^{]+\{\s*\[native \w/,$=/^(?:#([\w-]+)|(\w+)|\.([\w-]+))$/,_=/[+~]/,aa=/'|\\/g,ba=new RegExp("\\\\([\\da-f]{1,6}"+L+"?|("+L+")|.)","ig"),ca=function(a,b,c){var d="0x"+b-65536;return d!==d||c?b:0>d?String.fromCharCode(d+65536):String.fromCharCode(d>>10|55296,1023&d|56320)},da=function(){m()};try{H.apply(E=I.call(v.childNodes),v.childNodes),E[v.childNodes.length].nodeType}catch(ea){H={apply:E.length?function(a,b){G.apply(a,I.call(b))}:function(a,b){var c=a.length,d=0;while(a[c++]=b[d++]);a.length=c-1}}}function fa(a,b,d,e){var f,h,j,k,l,o,r,s,w=b&&b.ownerDocument,x=b?b.nodeType:9;if(d=d||[],"string"!=typeof a||!a||1!==x&&9!==x&&11!==x)return d;if(!e&&((b?b.ownerDocument||b:v)!==n&&m(b),b=b||n,p)){if(11!==x&&(o=$.exec(a)))if(f=o[1]){if(9===x){if(!(j=b.getElementById(f)))return d;if(j.id===f)return d.push(j),d}else if(w&&(j=w.getElementById(f))&&t(b,j)&&j.id===f)return d.push(j),d}else{if(o[2])return H.apply(d,b.getElementsByTagName(a)),d;if((f=o[3])&&c.getElementsByClassName&&b.getElementsByClassName)return H.apply(d,b.getElementsByClassName(f)),d}if(c.qsa&&!A[a+" "]&&(!q||!q.test(a))){if(1!==x)w=b,s=a;else if("object"!==b.nodeName.toLowerCase()){(k=b.getAttribute("id"))?k=k.replace(aa,"\\$&"):b.setAttribute("id",k=u),r=g(a),h=r.length,l=V.test(k)?"#"+k:"[id='"+k+"']";while(h--)r[h]=l+" "+qa(r[h]);s=r.join(","),w=_.test(a)&&oa(b.parentNode)||b}if(s)try{return H.apply(d,w.querySelectorAll(s)),d}catch(y){}finally{k===u&&b.removeAttribute("id")}}}return i(a.replace(Q,"$1"),b,d,e)}function ga(){var a=[];function b(c,e){return a.push(c+" ")>d.cacheLength&&delete b[a.shift()],b[c+" "]=e}return b}function ha(a){return a[u]=!0,a}function ia(a){var b=n.createElement("div");try{return!!a(b)}catch(c){return!1}finally{b.parentNode&&b.parentNode.removeChild(b),b=null}}function ja(a,b){var c=a.split("|"),e=c.length;while(e--)d.attrHandle[c[e]]=b}function ka(a,b){var c=b&&a,d=c&&1===a.nodeType&&1===b.nodeType&&(~b.sourceIndex||C)-(~a.sourceIndex||C);if(d)return d;if(c)while(c=c.nextSibling)if(c===b)return-1;return a?1:-1}function la(a){return function(b){var c=b.nodeName.toLowerCase();return"input"===c&&b.type===a}}function ma(a){return function(b){var c=b.nodeName.toLowerCase();return("input"===c||"button"===c)&&b.type===a}}function na(a){return ha(function(b){return b=+b,ha(function(c,d){var e,f=a([],c.length,b),g=f.length;while(g--)c[e=f[g]]&&(c[e]=!(d[e]=c[e]))})})}function oa(a){return a&&"undefined"!=typeof a.getElementsByTagName&&a}c=fa.support={},f=fa.isXML=function(a){var b=a&&(a.ownerDocument||a).documentElement;return b?"HTML"!==b.nodeName:!1},m=fa.setDocument=function(a){var b,e,g=a?a.ownerDocument||a:v;return g!==n&&9===g.nodeType&&g.documentElement?(n=g,o=n.documentElement,p=!f(n),(e=n.defaultView)&&e.top!==e&&(e.addEventListener?e.addEventListener("unload",da,!1):e.attachEvent&&e.attachEvent("onunload",da)),c.attributes=ia(function(a){return a.className="i",!a.getAttribute("className")}),c.getElementsByTagName=ia(function(a){return a.appendChild(n.createComment("")),!a.getElementsByTagName("*").length}),c.getElementsByClassName=Z.test(n.getElementsByClassName),c.getById=ia(function(a){return o.appendChild(a).id=u,!n.getElementsByName||!n.getElementsByName(u).length}),c.getById?(d.find.ID=function(a,b){if("undefined"!=typeof b.getElementById&&p){var c=b.getElementById(a);return c?[c]:[]}},d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){return a.getAttribute("id")===b}}):(delete d.find.ID,d.filter.ID=function(a){var b=a.replace(ba,ca);return function(a){var c="undefined"!=typeof a.getAttributeNode&&a.getAttributeNode("id");return c&&c.value===b}}),d.find.TAG=c.getElementsByTagName?function(a,b){return"undefined"!=typeof b.getElementsByTagName?b.getElementsByTagName(a):c.qsa?b.querySelectorAll(a):void 0}:function(a,b){var c,d=[],e=0,f=b.getElementsByTagName(a);if("*"===a){while(c=f[e++])1===c.nodeType&&d.push(c);return d}return f},d.find.CLASS=c.getElementsByClassName&&function(a,b){return"undefined"!=typeof b.getElementsByClassName&&p?b.getElementsByClassName(a):void 0},r=[],q=[],(c.qsa=Z.test(n.querySelectorAll))&&(ia(function(a){o.appendChild(a).innerHTML="",a.querySelectorAll("[msallowcapture^='']").length&&q.push("[*^$]="+L+"*(?:''|\"\")"),a.querySelectorAll("[selected]").length||q.push("\\["+L+"*(?:value|"+K+")"),a.querySelectorAll("[id~="+u+"-]").length||q.push("~="),a.querySelectorAll(":checked").length||q.push(":checked"),a.querySelectorAll("a#"+u+"+*").length||q.push(".#.+[+~]")}),ia(function(a){var b=n.createElement("input");b.setAttribute("type","hidden"),a.appendChild(b).setAttribute("name","D"),a.querySelectorAll("[name=d]").length&&q.push("name"+L+"*[*^$|!~]?="),a.querySelectorAll(":enabled").length||q.push(":enabled",":disabled"),a.querySelectorAll("*,:x"),q.push(",.*:")})),(c.matchesSelector=Z.test(s=o.matches||o.webkitMatchesSelector||o.mozMatchesSelector||o.oMatchesSelector||o.msMatchesSelector))&&ia(function(a){c.disconnectedMatch=s.call(a,"div"),s.call(a,"[s!='']:x"),r.push("!=",O)}),q=q.length&&new RegExp(q.join("|")),r=r.length&&new RegExp(r.join("|")),b=Z.test(o.compareDocumentPosition),t=b||Z.test(o.contains)?function(a,b){var c=9===a.nodeType?a.documentElement:a,d=b&&b.parentNode;return a===d||!(!d||1!==d.nodeType||!(c.contains?c.contains(d):a.compareDocumentPosition&&16&a.compareDocumentPosition(d)))}:function(a,b){if(b)while(b=b.parentNode)if(b===a)return!0;return!1},B=b?function(a,b){if(a===b)return l=!0,0;var d=!a.compareDocumentPosition-!b.compareDocumentPosition;return d?d:(d=(a.ownerDocument||a)===(b.ownerDocument||b)?a.compareDocumentPosition(b):1,1&d||!c.sortDetached&&b.compareDocumentPosition(a)===d?a===n||a.ownerDocument===v&&t(v,a)?-1:b===n||b.ownerDocument===v&&t(v,b)?1:k?J(k,a)-J(k,b):0:4&d?-1:1)}:function(a,b){if(a===b)return l=!0,0;var c,d=0,e=a.parentNode,f=b.parentNode,g=[a],h=[b];if(!e||!f)return a===n?-1:b===n?1:e?-1:f?1:k?J(k,a)-J(k,b):0;if(e===f)return ka(a,b);c=a;while(c=c.parentNode)g.unshift(c);c=b;while(c=c.parentNode)h.unshift(c);while(g[d]===h[d])d++;return d?ka(g[d],h[d]):g[d]===v?-1:h[d]===v?1:0},n):n},fa.matches=function(a,b){return fa(a,null,null,b)},fa.matchesSelector=function(a,b){if((a.ownerDocument||a)!==n&&m(a),b=b.replace(T,"='$1']"),c.matchesSelector&&p&&!A[b+" "]&&(!r||!r.test(b))&&(!q||!q.test(b)))try{var d=s.call(a,b);if(d||c.disconnectedMatch||a.document&&11!==a.document.nodeType)return d}catch(e){}return fa(b,n,null,[a]).length>0},fa.contains=function(a,b){return(a.ownerDocument||a)!==n&&m(a),t(a,b)},fa.attr=function(a,b){(a.ownerDocument||a)!==n&&m(a);var e=d.attrHandle[b.toLowerCase()],f=e&&D.call(d.attrHandle,b.toLowerCase())?e(a,b,!p):void 0;return void 0!==f?f:c.attributes||!p?a.getAttribute(b):(f=a.getAttributeNode(b))&&f.specified?f.value:null},fa.error=function(a){throw new Error("Syntax error, unrecognized expression: "+a)},fa.uniqueSort=function(a){var b,d=[],e=0,f=0;if(l=!c.detectDuplicates,k=!c.sortStable&&a.slice(0),a.sort(B),l){while(b=a[f++])b===a[f]&&(e=d.push(f));while(e--)a.splice(d[e],1)}return k=null,a},e=fa.getText=function(a){var b,c="",d=0,f=a.nodeType;if(f){if(1===f||9===f||11===f){if("string"==typeof a.textContent)return a.textContent;for(a=a.firstChild;a;a=a.nextSibling)c+=e(a)}else if(3===f||4===f)return a.nodeValue}else while(b=a[d++])c+=e(b);return c},d=fa.selectors={cacheLength:50,createPseudo:ha,match:W,attrHandle:{},find:{},relative:{">":{dir:"parentNode",first:!0}," ":{dir:"parentNode"},"+":{dir:"previousSibling",first:!0},"~":{dir:"previousSibling"}},preFilter:{ATTR:function(a){return a[1]=a[1].replace(ba,ca),a[3]=(a[3]||a[4]||a[5]||"").replace(ba,ca),"~="===a[2]&&(a[3]=" "+a[3]+" "),a.slice(0,4)},CHILD:function(a){return a[1]=a[1].toLowerCase(),"nth"===a[1].slice(0,3)?(a[3]||fa.error(a[0]),a[4]=+(a[4]?a[5]+(a[6]||1):2*("even"===a[3]||"odd"===a[3])),a[5]=+(a[7]+a[8]||"odd"===a[3])):a[3]&&fa.error(a[0]),a},PSEUDO:function(a){var b,c=!a[6]&&a[2];return W.CHILD.test(a[0])?null:(a[3]?a[2]=a[4]||a[5]||"":c&&U.test(c)&&(b=g(c,!0))&&(b=c.indexOf(")",c.length-b)-c.length)&&(a[0]=a[0].slice(0,b),a[2]=c.slice(0,b)),a.slice(0,3))}},filter:{TAG:function(a){var b=a.replace(ba,ca).toLowerCase();return"*"===a?function(){return!0}:function(a){return a.nodeName&&a.nodeName.toLowerCase()===b}},CLASS:function(a){var b=y[a+" "];return b||(b=new RegExp("(^|"+L+")"+a+"("+L+"|$)"))&&y(a,function(a){return b.test("string"==typeof a.className&&a.className||"undefined"!=typeof a.getAttribute&&a.getAttribute("class")||"")})},ATTR:function(a,b,c){return function(d){var e=fa.attr(d,a);return null==e?"!="===b:b?(e+="","="===b?e===c:"!="===b?e!==c:"^="===b?c&&0===e.indexOf(c):"*="===b?c&&e.indexOf(c)>-1:"$="===b?c&&e.slice(-c.length)===c:"~="===b?(" "+e.replace(P," ")+" ").indexOf(c)>-1:"|="===b?e===c||e.slice(0,c.length+1)===c+"-":!1):!0}},CHILD:function(a,b,c,d,e){var f="nth"!==a.slice(0,3),g="last"!==a.slice(-4),h="of-type"===b;return 1===d&&0===e?function(a){return!!a.parentNode}:function(b,c,i){var j,k,l,m,n,o,p=f!==g?"nextSibling":"previousSibling",q=b.parentNode,r=h&&b.nodeName.toLowerCase(),s=!i&&!h,t=!1;if(q){if(f){while(p){m=b;while(m=m[p])if(h?m.nodeName.toLowerCase()===r:1===m.nodeType)return!1;o=p="only"===a&&!o&&"nextSibling"}return!0}if(o=[g?q.firstChild:q.lastChild],g&&s){m=q,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n&&j[2],m=n&&q.childNodes[n];while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if(1===m.nodeType&&++t&&m===b){k[a]=[w,n,t];break}}else if(s&&(m=b,l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),j=k[a]||[],n=j[0]===w&&j[1],t=n),t===!1)while(m=++n&&m&&m[p]||(t=n=0)||o.pop())if((h?m.nodeName.toLowerCase()===r:1===m.nodeType)&&++t&&(s&&(l=m[u]||(m[u]={}),k=l[m.uniqueID]||(l[m.uniqueID]={}),k[a]=[w,t]),m===b))break;return t-=e,t===d||t%d===0&&t/d>=0}}},PSEUDO:function(a,b){var c,e=d.pseudos[a]||d.setFilters[a.toLowerCase()]||fa.error("unsupported pseudo: "+a);return e[u]?e(b):e.length>1?(c=[a,a,"",b],d.setFilters.hasOwnProperty(a.toLowerCase())?ha(function(a,c){var d,f=e(a,b),g=f.length;while(g--)d=J(a,f[g]),a[d]=!(c[d]=f[g])}):function(a){return e(a,0,c)}):e}},pseudos:{not:ha(function(a){var b=[],c=[],d=h(a.replace(Q,"$1"));return d[u]?ha(function(a,b,c,e){var f,g=d(a,null,e,[]),h=a.length;while(h--)(f=g[h])&&(a[h]=!(b[h]=f))}):function(a,e,f){return b[0]=a,d(b,null,f,c),b[0]=null,!c.pop()}}),has:ha(function(a){return function(b){return fa(a,b).length>0}}),contains:ha(function(a){return a=a.replace(ba,ca),function(b){return(b.textContent||b.innerText||e(b)).indexOf(a)>-1}}),lang:ha(function(a){return V.test(a||"")||fa.error("unsupported lang: "+a),a=a.replace(ba,ca).toLowerCase(),function(b){var c;do if(c=p?b.lang:b.getAttribute("xml:lang")||b.getAttribute("lang"))return c=c.toLowerCase(),c===a||0===c.indexOf(a+"-");while((b=b.parentNode)&&1===b.nodeType);return!1}}),target:function(b){var c=a.location&&a.location.hash;return c&&c.slice(1)===b.id},root:function(a){return a===o},focus:function(a){return a===n.activeElement&&(!n.hasFocus||n.hasFocus())&&!!(a.type||a.href||~a.tabIndex)},enabled:function(a){return a.disabled===!1},disabled:function(a){return a.disabled===!0},checked:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&!!a.checked||"option"===b&&!!a.selected},selected:function(a){return a.parentNode&&a.parentNode.selectedIndex,a.selected===!0},empty:function(a){for(a=a.firstChild;a;a=a.nextSibling)if(a.nodeType<6)return!1;return!0},parent:function(a){return!d.pseudos.empty(a)},header:function(a){return Y.test(a.nodeName)},input:function(a){return X.test(a.nodeName)},button:function(a){var b=a.nodeName.toLowerCase();return"input"===b&&"button"===a.type||"button"===b},text:function(a){var b;return"input"===a.nodeName.toLowerCase()&&"text"===a.type&&(null==(b=a.getAttribute("type"))||"text"===b.toLowerCase())},first:na(function(){return[0]}),last:na(function(a,b){return[b-1]}),eq:na(function(a,b,c){return[0>c?c+b:c]}),even:na(function(a,b){for(var c=0;b>c;c+=2)a.push(c);return a}),odd:na(function(a,b){for(var c=1;b>c;c+=2)a.push(c);return a}),lt:na(function(a,b,c){for(var d=0>c?c+b:c;--d>=0;)a.push(d);return a}),gt:na(function(a,b,c){for(var d=0>c?c+b:c;++db;b++)d+=a[b].value;return d}function ra(a,b,c){var d=b.dir,e=c&&"parentNode"===d,f=x++;return b.first?function(b,c,f){while(b=b[d])if(1===b.nodeType||e)return a(b,c,f)}:function(b,c,g){var h,i,j,k=[w,f];if(g){while(b=b[d])if((1===b.nodeType||e)&&a(b,c,g))return!0}else while(b=b[d])if(1===b.nodeType||e){if(j=b[u]||(b[u]={}),i=j[b.uniqueID]||(j[b.uniqueID]={}),(h=i[d])&&h[0]===w&&h[1]===f)return k[2]=h[2];if(i[d]=k,k[2]=a(b,c,g))return!0}}}function sa(a){return a.length>1?function(b,c,d){var e=a.length;while(e--)if(!a[e](b,c,d))return!1;return!0}:a[0]}function ta(a,b,c){for(var d=0,e=b.length;e>d;d++)fa(a,b[d],c);return c}function ua(a,b,c,d,e){for(var f,g=[],h=0,i=a.length,j=null!=b;i>h;h++)(f=a[h])&&(c&&!c(f,d,e)||(g.push(f),j&&b.push(h)));return g}function va(a,b,c,d,e,f){return d&&!d[u]&&(d=va(d)),e&&!e[u]&&(e=va(e,f)),ha(function(f,g,h,i){var j,k,l,m=[],n=[],o=g.length,p=f||ta(b||"*",h.nodeType?[h]:h,[]),q=!a||!f&&b?p:ua(p,m,a,h,i),r=c?e||(f?a:o||d)?[]:g:q;if(c&&c(q,r,h,i),d){j=ua(r,n),d(j,[],h,i),k=j.length;while(k--)(l=j[k])&&(r[n[k]]=!(q[n[k]]=l))}if(f){if(e||a){if(e){j=[],k=r.length;while(k--)(l=r[k])&&j.push(q[k]=l);e(null,r=[],j,i)}k=r.length;while(k--)(l=r[k])&&(j=e?J(f,l):m[k])>-1&&(f[j]=!(g[j]=l))}}else r=ua(r===g?r.splice(o,r.length):r),e?e(null,g,r,i):H.apply(g,r)})}function wa(a){for(var b,c,e,f=a.length,g=d.relative[a[0].type],h=g||d.relative[" "],i=g?1:0,k=ra(function(a){return a===b},h,!0),l=ra(function(a){return J(b,a)>-1},h,!0),m=[function(a,c,d){var e=!g&&(d||c!==j)||((b=c).nodeType?k(a,c,d):l(a,c,d));return b=null,e}];f>i;i++)if(c=d.relative[a[i].type])m=[ra(sa(m),c)];else{if(c=d.filter[a[i].type].apply(null,a[i].matches),c[u]){for(e=++i;f>e;e++)if(d.relative[a[e].type])break;return va(i>1&&sa(m),i>1&&qa(a.slice(0,i-1).concat({value:" "===a[i-2].type?"*":""})).replace(Q,"$1"),c,e>i&&wa(a.slice(i,e)),f>e&&wa(a=a.slice(e)),f>e&&qa(a))}m.push(c)}return sa(m)}function xa(a,b){var c=b.length>0,e=a.length>0,f=function(f,g,h,i,k){var l,o,q,r=0,s="0",t=f&&[],u=[],v=j,x=f||e&&d.find.TAG("*",k),y=w+=null==v?1:Math.random()||.1,z=x.length;for(k&&(j=g===n||g||k);s!==z&&null!=(l=x[s]);s++){if(e&&l){o=0,g||l.ownerDocument===n||(m(l),h=!p);while(q=a[o++])if(q(l,g||n,h)){i.push(l);break}k&&(w=y)}c&&((l=!q&&l)&&r--,f&&t.push(l))}if(r+=s,c&&s!==r){o=0;while(q=b[o++])q(t,u,g,h);if(f){if(r>0)while(s--)t[s]||u[s]||(u[s]=F.call(i));u=ua(u)}H.apply(i,u),k&&!f&&u.length>0&&r+b.length>1&&fa.uniqueSort(i)}return k&&(w=y,j=v),t};return c?ha(f):f}return h=fa.compile=function(a,b){var c,d=[],e=[],f=A[a+" "];if(!f){b||(b=g(a)),c=b.length;while(c--)f=wa(b[c]),f[u]?d.push(f):e.push(f);f=A(a,xa(e,d)),f.selector=a}return f},i=fa.select=function(a,b,e,f){var i,j,k,l,m,n="function"==typeof a&&a,o=!f&&g(a=n.selector||a);if(e=e||[],1===o.length){if(j=o[0]=o[0].slice(0),j.length>2&&"ID"===(k=j[0]).type&&c.getById&&9===b.nodeType&&p&&d.relative[j[1].type]){if(b=(d.find.ID(k.matches[0].replace(ba,ca),b)||[])[0],!b)return e;n&&(b=b.parentNode),a=a.slice(j.shift().value.length)}i=W.needsContext.test(a)?0:j.length;while(i--){if(k=j[i],d.relative[l=k.type])break;if((m=d.find[l])&&(f=m(k.matches[0].replace(ba,ca),_.test(j[0].type)&&oa(b.parentNode)||b))){if(j.splice(i,1),a=f.length&&qa(j),!a)return H.apply(e,f),e;break}}}return(n||h(a,o))(f,b,!p,e,!b||_.test(a)&&oa(b.parentNode)||b),e},c.sortStable=u.split("").sort(B).join("")===u,c.detectDuplicates=!!l,m(),c.sortDetached=ia(function(a){return 1&a.compareDocumentPosition(n.createElement("div"))}),ia(function(a){return a.innerHTML="","#"===a.firstChild.getAttribute("href")})||ja("type|href|height|width",function(a,b,c){return c?void 0:a.getAttribute(b,"type"===b.toLowerCase()?1:2)}),c.attributes&&ia(function(a){return a.innerHTML="",a.firstChild.setAttribute("value",""),""===a.firstChild.getAttribute("value")})||ja("value",function(a,b,c){return c||"input"!==a.nodeName.toLowerCase()?void 0:a.defaultValue}),ia(function(a){return null==a.getAttribute("disabled")})||ja(K,function(a,b,c){var d;return c?void 0:a[b]===!0?b.toLowerCase():(d=a.getAttributeNode(b))&&d.specified?d.value:null}),fa}(a);n.find=t,n.expr=t.selectors,n.expr[":"]=n.expr.pseudos,n.uniqueSort=n.unique=t.uniqueSort,n.text=t.getText,n.isXMLDoc=t.isXML,n.contains=t.contains;var u=function(a,b,c){var d=[],e=void 0!==c;while((a=a[b])&&9!==a.nodeType)if(1===a.nodeType){if(e&&n(a).is(c))break;d.push(a)}return d},v=function(a,b){for(var c=[];a;a=a.nextSibling)1===a.nodeType&&a!==b&&c.push(a);return c},w=n.expr.match.needsContext,x=/^<([\w-]+)\s*\/?>(?:<\/\1>|)$/,y=/^.[^:#\[\.,]*$/;function z(a,b,c){if(n.isFunction(b))return n.grep(a,function(a,d){return!!b.call(a,d,a)!==c});if(b.nodeType)return n.grep(a,function(a){return a===b!==c});if("string"==typeof b){if(y.test(b))return n.filter(b,a,c);b=n.filter(b,a)}return n.grep(a,function(a){return h.call(b,a)>-1!==c})}n.filter=function(a,b,c){var d=b[0];return c&&(a=":not("+a+")"),1===b.length&&1===d.nodeType?n.find.matchesSelector(d,a)?[d]:[]:n.find.matches(a,n.grep(b,function(a){return 1===a.nodeType}))},n.fn.extend({find:function(a){var b,c=this.length,d=[],e=this;if("string"!=typeof a)return this.pushStack(n(a).filter(function(){for(b=0;c>b;b++)if(n.contains(e[b],this))return!0}));for(b=0;c>b;b++)n.find(a,e[b],d);return d=this.pushStack(c>1?n.unique(d):d),d.selector=this.selector?this.selector+" "+a:a,d},filter:function(a){return this.pushStack(z(this,a||[],!1))},not:function(a){return this.pushStack(z(this,a||[],!0))},is:function(a){return!!z(this,"string"==typeof a&&w.test(a)?n(a):a||[],!1).length}});var A,B=/^(?:\s*(<[\w\W]+>)[^>]*|#([\w-]*))$/,C=n.fn.init=function(a,b,c){var e,f;if(!a)return this;if(c=c||A,"string"==typeof a){if(e="<"===a[0]&&">"===a[a.length-1]&&a.length>=3?[null,a,null]:B.exec(a),!e||!e[1]&&b)return!b||b.jquery?(b||c).find(a):this.constructor(b).find(a);if(e[1]){if(b=b instanceof n?b[0]:b,n.merge(this,n.parseHTML(e[1],b&&b.nodeType?b.ownerDocument||b:d,!0)),x.test(e[1])&&n.isPlainObject(b))for(e in b)n.isFunction(this[e])?this[e](b[e]):this.attr(e,b[e]);return this}return f=d.getElementById(e[2]),f&&f.parentNode&&(this.length=1,this[0]=f),this.context=d,this.selector=a,this}return a.nodeType?(this.context=this[0]=a,this.length=1,this):n.isFunction(a)?void 0!==c.ready?c.ready(a):a(n):(void 0!==a.selector&&(this.selector=a.selector,this.context=a.context),n.makeArray(a,this))};C.prototype=n.fn,A=n(d);var D=/^(?:parents|prev(?:Until|All))/,E={children:!0,contents:!0,next:!0,prev:!0};n.fn.extend({has:function(a){var b=n(a,this),c=b.length;return this.filter(function(){for(var a=0;c>a;a++)if(n.contains(this,b[a]))return!0})},closest:function(a,b){for(var c,d=0,e=this.length,f=[],g=w.test(a)||"string"!=typeof a?n(a,b||this.context):0;e>d;d++)for(c=this[d];c&&c!==b;c=c.parentNode)if(c.nodeType<11&&(g?g.index(c)>-1:1===c.nodeType&&n.find.matchesSelector(c,a))){f.push(c);break}return this.pushStack(f.length>1?n.uniqueSort(f):f)},index:function(a){return a?"string"==typeof a?h.call(n(a),this[0]):h.call(this,a.jquery?a[0]:a):this[0]&&this[0].parentNode?this.first().prevAll().length:-1},add:function(a,b){return this.pushStack(n.uniqueSort(n.merge(this.get(),n(a,b))))},addBack:function(a){return this.add(null==a?this.prevObject:this.prevObject.filter(a))}});function F(a,b){while((a=a[b])&&1!==a.nodeType);return a}n.each({parent:function(a){var b=a.parentNode;return b&&11!==b.nodeType?b:null},parents:function(a){return u(a,"parentNode")},parentsUntil:function(a,b,c){return u(a,"parentNode",c)},next:function(a){return F(a,"nextSibling")},prev:function(a){return F(a,"previousSibling")},nextAll:function(a){return u(a,"nextSibling")},prevAll:function(a){return u(a,"previousSibling")},nextUntil:function(a,b,c){return u(a,"nextSibling",c)},prevUntil:function(a,b,c){return u(a,"previousSibling",c)},siblings:function(a){return v((a.parentNode||{}).firstChild,a)},children:function(a){return v(a.firstChild)},contents:function(a){return a.contentDocument||n.merge([],a.childNodes)}},function(a,b){n.fn[a]=function(c,d){var e=n.map(this,b,c);return"Until"!==a.slice(-5)&&(d=c),d&&"string"==typeof d&&(e=n.filter(d,e)),this.length>1&&(E[a]||n.uniqueSort(e),D.test(a)&&e.reverse()),this.pushStack(e)}});var G=/\S+/g;function H(a){var b={};return n.each(a.match(G)||[],function(a,c){b[c]=!0}),b}n.Callbacks=function(a){a="string"==typeof a?H(a):n.extend({},a);var b,c,d,e,f=[],g=[],h=-1,i=function(){for(e=a.once,d=b=!0;g.length;h=-1){c=g.shift();while(++h-1)f.splice(c,1),h>=c&&h--}),this},has:function(a){return a?n.inArray(a,f)>-1:f.length>0},empty:function(){return f&&(f=[]),this},disable:function(){return e=g=[],f=c="",this},disabled:function(){return!f},lock:function(){return e=g=[],c||(f=c=""),this},locked:function(){return!!e},fireWith:function(a,c){return e||(c=c||[],c=[a,c.slice?c.slice():c],g.push(c),b||i()),this},fire:function(){return j.fireWith(this,arguments),this},fired:function(){return!!d}};return j},n.extend({Deferred:function(a){var b=[["resolve","done",n.Callbacks("once memory"),"resolved"],["reject","fail",n.Callbacks("once memory"),"rejected"],["notify","progress",n.Callbacks("memory")]],c="pending",d={state:function(){return c},always:function(){return e.done(arguments).fail(arguments),this},then:function(){var a=arguments;return n.Deferred(function(c){n.each(b,function(b,f){var g=n.isFunction(a[b])&&a[b];e[f[1]](function(){var a=g&&g.apply(this,arguments);a&&n.isFunction(a.promise)?a.promise().progress(c.notify).done(c.resolve).fail(c.reject):c[f[0]+"With"](this===d?c.promise():this,g?[a]:arguments)})}),a=null}).promise()},promise:function(a){return null!=a?n.extend(a,d):d}},e={};return d.pipe=d.then,n.each(b,function(a,f){var g=f[2],h=f[3];d[f[1]]=g.add,h&&g.add(function(){c=h},b[1^a][2].disable,b[2][2].lock),e[f[0]]=function(){return e[f[0]+"With"](this===e?d:this,arguments),this},e[f[0]+"With"]=g.fireWith}),d.promise(e),a&&a.call(e,e),e},when:function(a){var b=0,c=e.call(arguments),d=c.length,f=1!==d||a&&n.isFunction(a.promise)?d:0,g=1===f?a:n.Deferred(),h=function(a,b,c){return function(d){b[a]=this,c[a]=arguments.length>1?e.call(arguments):d,c===i?g.notifyWith(b,c):--f||g.resolveWith(b,c)}},i,j,k;if(d>1)for(i=new Array(d),j=new Array(d),k=new Array(d);d>b;b++)c[b]&&n.isFunction(c[b].promise)?c[b].promise().progress(h(b,j,i)).done(h(b,k,c)).fail(g.reject):--f;return f||g.resolveWith(k,c),g.promise()}});var I;n.fn.ready=function(a){return n.ready.promise().done(a),this},n.extend({isReady:!1,readyWait:1,holdReady:function(a){a?n.readyWait++:n.ready(!0)},ready:function(a){(a===!0?--n.readyWait:n.isReady)||(n.isReady=!0,a!==!0&&--n.readyWait>0||(I.resolveWith(d,[n]),n.fn.triggerHandler&&(n(d).triggerHandler("ready"),n(d).off("ready"))))}});function J(){d.removeEventListener("DOMContentLoaded",J),a.removeEventListener("load",J),n.ready()}n.ready.promise=function(b){return I||(I=n.Deferred(),"complete"===d.readyState||"loading"!==d.readyState&&!d.documentElement.doScroll?a.setTimeout(n.ready):(d.addEventListener("DOMContentLoaded",J),a.addEventListener("load",J))),I.promise(b)},n.ready.promise();var K=function(a,b,c,d,e,f,g){var h=0,i=a.length,j=null==c;if("object"===n.type(c)){e=!0;for(h in c)K(a,b,h,c[h],!0,f,g)}else if(void 0!==d&&(e=!0,n.isFunction(d)||(g=!0),j&&(g?(b.call(a,d),b=null):(j=b,b=function(a,b,c){return j.call(n(a),c)})),b))for(;i>h;h++)b(a[h],c,g?d:d.call(a[h],h,b(a[h],c)));return e?a:j?b.call(a):i?b(a[0],c):f},L=function(a){return 1===a.nodeType||9===a.nodeType||!+a.nodeType};function M(){this.expando=n.expando+M.uid++}M.uid=1,M.prototype={register:function(a,b){var c=b||{};return a.nodeType?a[this.expando]=c:Object.defineProperty(a,this.expando,{value:c,writable:!0,configurable:!0}),a[this.expando]},cache:function(a){if(!L(a))return{};var b=a[this.expando];return b||(b={},L(a)&&(a.nodeType?a[this.expando]=b:Object.defineProperty(a,this.expando,{value:b,configurable:!0}))),b},set:function(a,b,c){var d,e=this.cache(a);if("string"==typeof b)e[b]=c;else for(d in b)e[d]=b[d];return e},get:function(a,b){return void 0===b?this.cache(a):a[this.expando]&&a[this.expando][b]},access:function(a,b,c){var d;return void 0===b||b&&"string"==typeof b&&void 0===c?(d=this.get(a,b),void 0!==d?d:this.get(a,n.camelCase(b))):(this.set(a,b,c),void 0!==c?c:b)},remove:function(a,b){var c,d,e,f=a[this.expando];if(void 0!==f){if(void 0===b)this.register(a);else{n.isArray(b)?d=b.concat(b.map(n.camelCase)):(e=n.camelCase(b),b in f?d=[b,e]:(d=e,d=d in f?[d]:d.match(G)||[])),c=d.length;while(c--)delete f[d[c]]}(void 0===b||n.isEmptyObject(f))&&(a.nodeType?a[this.expando]=void 0:delete a[this.expando])}},hasData:function(a){var b=a[this.expando];return void 0!==b&&!n.isEmptyObject(b)}};var N=new M,O=new M,P=/^(?:\{[\w\W]*\}|\[[\w\W]*\])$/,Q=/[A-Z]/g;function R(a,b,c){var d;if(void 0===c&&1===a.nodeType)if(d="data-"+b.replace(Q,"-$&").toLowerCase(),c=a.getAttribute(d),"string"==typeof c){try{c="true"===c?!0:"false"===c?!1:"null"===c?null:+c+""===c?+c:P.test(c)?n.parseJSON(c):c; +}catch(e){}O.set(a,b,c)}else c=void 0;return c}n.extend({hasData:function(a){return O.hasData(a)||N.hasData(a)},data:function(a,b,c){return O.access(a,b,c)},removeData:function(a,b){O.remove(a,b)},_data:function(a,b,c){return N.access(a,b,c)},_removeData:function(a,b){N.remove(a,b)}}),n.fn.extend({data:function(a,b){var c,d,e,f=this[0],g=f&&f.attributes;if(void 0===a){if(this.length&&(e=O.get(f),1===f.nodeType&&!N.get(f,"hasDataAttrs"))){c=g.length;while(c--)g[c]&&(d=g[c].name,0===d.indexOf("data-")&&(d=n.camelCase(d.slice(5)),R(f,d,e[d])));N.set(f,"hasDataAttrs",!0)}return e}return"object"==typeof a?this.each(function(){O.set(this,a)}):K(this,function(b){var c,d;if(f&&void 0===b){if(c=O.get(f,a)||O.get(f,a.replace(Q,"-$&").toLowerCase()),void 0!==c)return c;if(d=n.camelCase(a),c=O.get(f,d),void 0!==c)return c;if(c=R(f,d,void 0),void 0!==c)return c}else d=n.camelCase(a),this.each(function(){var c=O.get(this,d);O.set(this,d,b),a.indexOf("-")>-1&&void 0!==c&&O.set(this,a,b)})},null,b,arguments.length>1,null,!0)},removeData:function(a){return this.each(function(){O.remove(this,a)})}}),n.extend({queue:function(a,b,c){var d;return a?(b=(b||"fx")+"queue",d=N.get(a,b),c&&(!d||n.isArray(c)?d=N.access(a,b,n.makeArray(c)):d.push(c)),d||[]):void 0},dequeue:function(a,b){b=b||"fx";var c=n.queue(a,b),d=c.length,e=c.shift(),f=n._queueHooks(a,b),g=function(){n.dequeue(a,b)};"inprogress"===e&&(e=c.shift(),d--),e&&("fx"===b&&c.unshift("inprogress"),delete f.stop,e.call(a,g,f)),!d&&f&&f.empty.fire()},_queueHooks:function(a,b){var c=b+"queueHooks";return N.get(a,c)||N.access(a,c,{empty:n.Callbacks("once memory").add(function(){N.remove(a,[b+"queue",c])})})}}),n.fn.extend({queue:function(a,b){var c=2;return"string"!=typeof a&&(b=a,a="fx",c--),arguments.length",""],thead:[1,"","
    "],col:[2,"","
    "],tr:[2,"","
    "],td:[3,"","
    "],_default:[0,"",""]};$.optgroup=$.option,$.tbody=$.tfoot=$.colgroup=$.caption=$.thead,$.th=$.td;function _(a,b){var c="undefined"!=typeof a.getElementsByTagName?a.getElementsByTagName(b||"*"):"undefined"!=typeof a.querySelectorAll?a.querySelectorAll(b||"*"):[];return void 0===b||b&&n.nodeName(a,b)?n.merge([a],c):c}function aa(a,b){for(var c=0,d=a.length;d>c;c++)N.set(a[c],"globalEval",!b||N.get(b[c],"globalEval"))}var ba=/<|&#?\w+;/;function ca(a,b,c,d,e){for(var f,g,h,i,j,k,l=b.createDocumentFragment(),m=[],o=0,p=a.length;p>o;o++)if(f=a[o],f||0===f)if("object"===n.type(f))n.merge(m,f.nodeType?[f]:f);else if(ba.test(f)){g=g||l.appendChild(b.createElement("div")),h=(Y.exec(f)||["",""])[1].toLowerCase(),i=$[h]||$._default,g.innerHTML=i[1]+n.htmlPrefilter(f)+i[2],k=i[0];while(k--)g=g.lastChild;n.merge(m,g.childNodes),g=l.firstChild,g.textContent=""}else m.push(b.createTextNode(f));l.textContent="",o=0;while(f=m[o++])if(d&&n.inArray(f,d)>-1)e&&e.push(f);else if(j=n.contains(f.ownerDocument,f),g=_(l.appendChild(f),"script"),j&&aa(g),c){k=0;while(f=g[k++])Z.test(f.type||"")&&c.push(f)}return l}!function(){var a=d.createDocumentFragment(),b=a.appendChild(d.createElement("div")),c=d.createElement("input");c.setAttribute("type","radio"),c.setAttribute("checked","checked"),c.setAttribute("name","t"),b.appendChild(c),l.checkClone=b.cloneNode(!0).cloneNode(!0).lastChild.checked,b.innerHTML="",l.noCloneChecked=!!b.cloneNode(!0).lastChild.defaultValue}();var da=/^key/,ea=/^(?:mouse|pointer|contextmenu|drag|drop)|click/,fa=/^([^.]*)(?:\.(.+)|)/;function ga(){return!0}function ha(){return!1}function ia(){try{return d.activeElement}catch(a){}}function ja(a,b,c,d,e,f){var g,h;if("object"==typeof b){"string"!=typeof c&&(d=d||c,c=void 0);for(h in b)ja(a,h,c,d,b[h],f);return a}if(null==d&&null==e?(e=c,d=c=void 0):null==e&&("string"==typeof c?(e=d,d=void 0):(e=d,d=c,c=void 0)),e===!1)e=ha;else if(!e)return a;return 1===f&&(g=e,e=function(a){return n().off(a),g.apply(this,arguments)},e.guid=g.guid||(g.guid=n.guid++)),a.each(function(){n.event.add(this,b,e,d,c)})}n.event={global:{},add:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.get(a);if(r){c.handler&&(f=c,c=f.handler,e=f.selector),c.guid||(c.guid=n.guid++),(i=r.events)||(i=r.events={}),(g=r.handle)||(g=r.handle=function(b){return"undefined"!=typeof n&&n.event.triggered!==b.type?n.event.dispatch.apply(a,arguments):void 0}),b=(b||"").match(G)||[""],j=b.length;while(j--)h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o&&(l=n.event.special[o]||{},o=(e?l.delegateType:l.bindType)||o,l=n.event.special[o]||{},k=n.extend({type:o,origType:q,data:d,handler:c,guid:c.guid,selector:e,needsContext:e&&n.expr.match.needsContext.test(e),namespace:p.join(".")},f),(m=i[o])||(m=i[o]=[],m.delegateCount=0,l.setup&&l.setup.call(a,d,p,g)!==!1||a.addEventListener&&a.addEventListener(o,g)),l.add&&(l.add.call(a,k),k.handler.guid||(k.handler.guid=c.guid)),e?m.splice(m.delegateCount++,0,k):m.push(k),n.event.global[o]=!0)}},remove:function(a,b,c,d,e){var f,g,h,i,j,k,l,m,o,p,q,r=N.hasData(a)&&N.get(a);if(r&&(i=r.events)){b=(b||"").match(G)||[""],j=b.length;while(j--)if(h=fa.exec(b[j])||[],o=q=h[1],p=(h[2]||"").split(".").sort(),o){l=n.event.special[o]||{},o=(d?l.delegateType:l.bindType)||o,m=i[o]||[],h=h[2]&&new RegExp("(^|\\.)"+p.join("\\.(?:.*\\.|)")+"(\\.|$)"),g=f=m.length;while(f--)k=m[f],!e&&q!==k.origType||c&&c.guid!==k.guid||h&&!h.test(k.namespace)||d&&d!==k.selector&&("**"!==d||!k.selector)||(m.splice(f,1),k.selector&&m.delegateCount--,l.remove&&l.remove.call(a,k));g&&!m.length&&(l.teardown&&l.teardown.call(a,p,r.handle)!==!1||n.removeEvent(a,o,r.handle),delete i[o])}else for(o in i)n.event.remove(a,o+b[j],c,d,!0);n.isEmptyObject(i)&&N.remove(a,"handle events")}},dispatch:function(a){a=n.event.fix(a);var b,c,d,f,g,h=[],i=e.call(arguments),j=(N.get(this,"events")||{})[a.type]||[],k=n.event.special[a.type]||{};if(i[0]=a,a.delegateTarget=this,!k.preDispatch||k.preDispatch.call(this,a)!==!1){h=n.event.handlers.call(this,a,j),b=0;while((f=h[b++])&&!a.isPropagationStopped()){a.currentTarget=f.elem,c=0;while((g=f.handlers[c++])&&!a.isImmediatePropagationStopped())a.rnamespace&&!a.rnamespace.test(g.namespace)||(a.handleObj=g,a.data=g.data,d=((n.event.special[g.origType]||{}).handle||g.handler).apply(f.elem,i),void 0!==d&&(a.result=d)===!1&&(a.preventDefault(),a.stopPropagation()))}return k.postDispatch&&k.postDispatch.call(this,a),a.result}},handlers:function(a,b){var c,d,e,f,g=[],h=b.delegateCount,i=a.target;if(h&&i.nodeType&&("click"!==a.type||isNaN(a.button)||a.button<1))for(;i!==this;i=i.parentNode||this)if(1===i.nodeType&&(i.disabled!==!0||"click"!==a.type)){for(d=[],c=0;h>c;c++)f=b[c],e=f.selector+" ",void 0===d[e]&&(d[e]=f.needsContext?n(e,this).index(i)>-1:n.find(e,this,null,[i]).length),d[e]&&d.push(f);d.length&&g.push({elem:i,handlers:d})}return h]*)\/>/gi,la=/\s*$/g;function pa(a,b){return n.nodeName(a,"table")&&n.nodeName(11!==b.nodeType?b:b.firstChild,"tr")?a.getElementsByTagName("tbody")[0]||a.appendChild(a.ownerDocument.createElement("tbody")):a}function qa(a){return a.type=(null!==a.getAttribute("type"))+"/"+a.type,a}function ra(a){var b=na.exec(a.type);return b?a.type=b[1]:a.removeAttribute("type"),a}function sa(a,b){var c,d,e,f,g,h,i,j;if(1===b.nodeType){if(N.hasData(a)&&(f=N.access(a),g=N.set(b,f),j=f.events)){delete g.handle,g.events={};for(e in j)for(c=0,d=j[e].length;d>c;c++)n.event.add(b,e,j[e][c])}O.hasData(a)&&(h=O.access(a),i=n.extend({},h),O.set(b,i))}}function ta(a,b){var c=b.nodeName.toLowerCase();"input"===c&&X.test(a.type)?b.checked=a.checked:"input"!==c&&"textarea"!==c||(b.defaultValue=a.defaultValue)}function ua(a,b,c,d){b=f.apply([],b);var e,g,h,i,j,k,m=0,o=a.length,p=o-1,q=b[0],r=n.isFunction(q);if(r||o>1&&"string"==typeof q&&!l.checkClone&&ma.test(q))return a.each(function(e){var f=a.eq(e);r&&(b[0]=q.call(this,e,f.html())),ua(f,b,c,d)});if(o&&(e=ca(b,a[0].ownerDocument,!1,a,d),g=e.firstChild,1===e.childNodes.length&&(e=g),g||d)){for(h=n.map(_(e,"script"),qa),i=h.length;o>m;m++)j=e,m!==p&&(j=n.clone(j,!0,!0),i&&n.merge(h,_(j,"script"))),c.call(a[m],j,m);if(i)for(k=h[h.length-1].ownerDocument,n.map(h,ra),m=0;i>m;m++)j=h[m],Z.test(j.type||"")&&!N.access(j,"globalEval")&&n.contains(k,j)&&(j.src?n._evalUrl&&n._evalUrl(j.src):n.globalEval(j.textContent.replace(oa,"")))}return a}function va(a,b,c){for(var d,e=b?n.filter(b,a):a,f=0;null!=(d=e[f]);f++)c||1!==d.nodeType||n.cleanData(_(d)),d.parentNode&&(c&&n.contains(d.ownerDocument,d)&&aa(_(d,"script")),d.parentNode.removeChild(d));return a}n.extend({htmlPrefilter:function(a){return a.replace(ka,"<$1>")},clone:function(a,b,c){var d,e,f,g,h=a.cloneNode(!0),i=n.contains(a.ownerDocument,a);if(!(l.noCloneChecked||1!==a.nodeType&&11!==a.nodeType||n.isXMLDoc(a)))for(g=_(h),f=_(a),d=0,e=f.length;e>d;d++)ta(f[d],g[d]);if(b)if(c)for(f=f||_(a),g=g||_(h),d=0,e=f.length;e>d;d++)sa(f[d],g[d]);else sa(a,h);return g=_(h,"script"),g.length>0&&aa(g,!i&&_(a,"script")),h},cleanData:function(a){for(var b,c,d,e=n.event.special,f=0;void 0!==(c=a[f]);f++)if(L(c)){if(b=c[N.expando]){if(b.events)for(d in b.events)e[d]?n.event.remove(c,d):n.removeEvent(c,d,b.handle);c[N.expando]=void 0}c[O.expando]&&(c[O.expando]=void 0)}}}),n.fn.extend({domManip:ua,detach:function(a){return va(this,a,!0)},remove:function(a){return va(this,a)},text:function(a){return K(this,function(a){return void 0===a?n.text(this):this.empty().each(function(){1!==this.nodeType&&11!==this.nodeType&&9!==this.nodeType||(this.textContent=a)})},null,a,arguments.length)},append:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.appendChild(a)}})},prepend:function(){return ua(this,arguments,function(a){if(1===this.nodeType||11===this.nodeType||9===this.nodeType){var b=pa(this,a);b.insertBefore(a,b.firstChild)}})},before:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this)})},after:function(){return ua(this,arguments,function(a){this.parentNode&&this.parentNode.insertBefore(a,this.nextSibling)})},empty:function(){for(var a,b=0;null!=(a=this[b]);b++)1===a.nodeType&&(n.cleanData(_(a,!1)),a.textContent="");return this},clone:function(a,b){return a=null==a?!1:a,b=null==b?a:b,this.map(function(){return n.clone(this,a,b)})},html:function(a){return K(this,function(a){var b=this[0]||{},c=0,d=this.length;if(void 0===a&&1===b.nodeType)return b.innerHTML;if("string"==typeof a&&!la.test(a)&&!$[(Y.exec(a)||["",""])[1].toLowerCase()]){a=n.htmlPrefilter(a);try{for(;d>c;c++)b=this[c]||{},1===b.nodeType&&(n.cleanData(_(b,!1)),b.innerHTML=a);b=0}catch(e){}}b&&this.empty().append(a)},null,a,arguments.length)},replaceWith:function(){var a=[];return ua(this,arguments,function(b){var c=this.parentNode;n.inArray(this,a)<0&&(n.cleanData(_(this)),c&&c.replaceChild(b,this))},a)}}),n.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(a,b){n.fn[a]=function(a){for(var c,d=[],e=n(a),f=e.length-1,h=0;f>=h;h++)c=h===f?this:this.clone(!0),n(e[h])[b](c),g.apply(d,c.get());return this.pushStack(d)}});var wa,xa={HTML:"block",BODY:"block"};function ya(a,b){var c=n(b.createElement(a)).appendTo(b.body),d=n.css(c[0],"display");return c.detach(),d}function za(a){var b=d,c=xa[a];return c||(c=ya(a,b),"none"!==c&&c||(wa=(wa||n("